一个运用程序的2个dll,  这个两个dll共同调用一个dll(DLL3),但是希望DLL3的数据(比如全局变量,函数的静态变量)可以在调用它的那两个dll里保持一直, 有办法吗?

解决方案 »

  1.   

    DLL使用共享数据段!参考:
    用#pragma data_seg指令实现共享数据段。在Single.cpp包含头文件的语句后添加下列语句:#pragma data_seg(".SharedData")
    long m_nRun=-1;
    #pragma data_seg( )
       其中,.SharedData就是我们实现的共享数据段的名称。这个数据段只包含一个变量long m_nRun,初始值为-1。  下面在Single.def文件中使用SECTIONS语句设置该共享数据段的属性:SECTIONS
    .SharedData READ WRITE SHARED   这样就使得使用这个DLL的应用程序能以读写方式共享.SharedData中定义的变量。  然后设计检查程序已运行实例个数的函数并导出,仍然使用def文件:EXPORTS
    ; Explicit exports can go here
    JudgeNo @1   所要添加的只是JudgeNo @1这一条语句,意思是JudgeNo是第一个输出函数,如果需要,还可以添加其他函数。JudgeNo的实现是在Single.cpp中。long JudgeNo( )
    {return m_nRun;}   这里只是简单的返回了m_nRun的值,因为这个函数是供应用程序调用的。同时还要在Single.cpp的入口点函数DllMain返回成功值的语句前添加语句m_nRun++,意思是在应用程序启动连接DLL成功时对已经运行的实例进行计数。这里需要强调的是DLL共享数据的概念,它指的是多进程调用DLL时内存中只保存数据的一个副本供它们共同拥有,因此这里的变量m_nRun可以起到为程序所有运行的实例计数的作用。
      

  2.   

    同意楼上的,要注意的是
    long m_nRun=-1;  // 一定要初始化,否则就达不到共享的目的了
      

  3.   

    非常感谢 但是问题还是只要解决一半
    #pragma data_seg(".SharedData")
    long m_nRun=-1;
    #pragma data_seg( )
    我想要共享的数据是我自己定义的类的一个实例, myclass mycl;   可以吗?
      

  4.   

    不需要只运行一个实例啊
    呵呵,共享数据段就相当于在所有的DLL中这些数据是共同的,呵呵,他们放置(分配内存)的地方可能不同导致无论在什么地方修改,其他使用这个DLL的文件都能立刻获得到修改的值。他们是属于这个DLL类的而不属于某个DLL的实例的!
      

  5.   

    o 我没有说清楚
    #pragma data_seg(".SharedData")
    long m_nRun=-1; 《---  如果这里是改这样的那?:  myclass *myclA=NULL; //  myclass我定义的类
    #pragma data_seg( )                     T
                                            |
    一般来说我们要共享的不是一点简单的数据, 我想要共享的是我自己的类的一个实例的指针, 这样可以吗?   谢谢
      

  6.   

    我也不懂,请问是不是#pragma data_seg里面定义的变量在所有实例中数据共享,而其它不在#pragma data_seg(".SharedData") #pragma data_seg( )之内的变量则在每个实例中都相对独立?