一个dll会被多个进程调用,想在dll中设立一些共享数据,使得某个进程改了这个数据的值,能在另一进程中表现出来。
于是dll部分代码如下:
 #pragma data_seg ("sharedData")
    volatile int num = 0;
 #pragma data_seg()
 #pragma comment(linker,"/SECTION:sharedData,RWS") 并导出两个函数getNum 和 setNum 对num进行操作(利用critical_section设立了互斥访问)然后建立了一个MFC对话框程序,有两个按钮,相应单击事件如下:  void CDlgTestDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
hModule = LoadLibrary("testDll.dll");
typedef void (* LPSETNUM) (int i) ;
LPSETNUM lpSetNum = (LPSETNUM)GetProcAddress(hModule,"setNum");
lpSetNum(6);
FreeLibrary(hModule);
 }   void CDlgTestDlg::OnButton2() 
{
// TODO: Add your control notification handler code here
hModule = LoadLibrary("testDll.dll");
typedef int (* LPGETNUM) () ;
LPGETNUM lpGetNum = (LPGETNUM)GetProcAddress(hModule,"getNum");
CString s;
s.Format("%d",lpGetNum());
MessageBox(s);
FreeLibrary(hModule); 
}  编译后,启动两个对话框程序,在第一个对话框里单击Button1, 而在第二个对话框里单击Button2,显示num 还是为0 ~~~~  实在是搞不懂了,同样的方式在命令行程序里能实现不同进程对dll中共享数据的操作,但是换在对话框程序里怎么就不行了呢??  诚心求教........

解决方案 »

  1.   

    由于FreeLibrary(hModule); “testDll.dll”已经卸载了。
    把hModule = LoadLibrary("testDll.dll"); 和FreeLibrary(hModule); 移出OnButton1和OnButton2函数,仅在程序启动和退出时执行一次就可以了。
      

  2.   

    我试了,还是不行·····我在对话框程序1中点击了Button1,这时候dll里的共享变量num已经被设为6了,然后再点击对话框程序1中的Button2,MessageBox中显示num的值的确为6.但是,我点击对话框程序2中的Button2,MessageBox中显示num的值还是为0 ~~~~~~
      

  3.   

    把hModule = LoadLibrary("testDll.dll"); 放到程序启动项,
    两个对话框程序都启动以后,再操作,看是否正常?
      

  4.   

    能这样共享?? 晕了。。不同进程,不同的地址空间(虽然Getprocessaddr结果一样,但...)。。即使是dll,也会不同啊。。
    因此压根就不是一个变量,一个改变,肯定不会引起另外一个改变啊。。
      

  5.   

    SORRY。我搞错了。。看了下
    #pragma comment(linker,"/SECTION:sharedData,RWS") 学习了点东西。。高深,暂不作评论。
      

  6.   

    #pragma data_seg预处理指令用于设置共享数据段。例如: #pragma data_seg("SharedDataName") HHOOK hHook=NULL; //必须在定义的同时进行初始化!!!!#pragma data_seg() 在#pragma data_seg("SharedDataName")和#pragma data_seg()之间的所有变量将被访问该Dll的所有进程看到和共享。再加上一条指令#pragma comment(linker,"/section:.SharedDataName,rws"),[注意:数据节的名称is case sensitive]那么这个数据节中的数据可以在所有DLL的实例之间共享。所有对这些数据的操作都针对同一个实例的,而不是在每个进程的地址空间中都有一份。你的做法看似正缺的,但是为什么要加上" volatile "呢?不然去掉试试了。
      

  7.   

    关键在于freelibrary,你不能在用的时候载入并在用完后立刻free,因为一旦所有的对话框都free了,这个变量就不存在了,你设置的值也不可能存在了。
    你应该在进程开始时载入那个dll,并且永远不freelibrary
      

  8.   

    volatile是多线程用用的你这里虽然是重复访问好像volatile没啥用啊还有你注意一点因为你#pragma data_seg ("sharedData") 
        volatile int num = 0; 
    #pragma data_seg() 
    有可能每回启动的时候volatile int num = 0; 都会定义一次
    你可以试下两个都启动之后,再修改里面的内容看看
      

  9.   

    我把hModule = LoadLibrary("testDll.dll"); 放在对话框的构造函数里了,对话框程序启动后只装载一次dll  还是不行.......
      

  10.   

    不行,要不你抽个小空试一下.....    同样的方式,在命令行程序下能实现不同程序共享操作dll中的共享变量   但是换到MFC程序下就不行了,难道还有什么内幕不成?
      

  11.   

    volatile的确没啥用, 两个程序都启动后,再修改num值,还是不行。。   唉  郁闷啊
      

  12.   

    看不出来了,建议不要纠缠这个,用FileMapping做得了
      

  13.   

    我之前建立的dll是普通的win32 dll ,结果一直不行然后我刚刚试了试用MFC dll  结果就行了.......   难道~~~~
      

  14.   

    你该不是用的static的吧静态dll?