前段时间,有人问我,动态链接库被多个进程加载的话,是有几个副本。当时我想了想说,动态加载方式肯定是一个进程对应一个副本。静态的不清楚。后来经过咨询和在网上浏览资料发现:其实DLL不管哪种方式加载都是将副本加载到进程空间中。
正常编译下的dll,它的变量使用到的内存是独立的。比如你同时运行两个调用了某个dll的用户程序,试图对某一个在dll中定义的全局变量修改赋值的时候,两个程序里的变量值仍然是不同的。
那么如果你想两个dll副本的全局变量,内容共享,需要加入如下代码:
正常编译下的dll,它的变量使用到的内存是独立的。比如你同时运行两个调用了某个dll的用户程序,试图对某一个在dll中定义的全局变量修改赋值的时候,两个程序里的变量值仍然是不同的。
那么如果你想两个dll副本的全局变量,内容共享,需要加入如下代码:
#pragma data_seg (".shared") HWND g_hWnd = 0; //要读取的编辑框控件句柄 HHOOK g_hHook = 0; //HOOK句柄 UINT WM_HOOKSPY = 0; //自定义消息,通知远程进程读取编辑框控件的内容 TCHAR g_szPassword [256] = { '/0' }; //保存编辑框控件的缓存区 #pragma data_seg () #pragma comment(linker, "/SECTION:.shared,RWS") // 注意上面代码段最好写在cpp文件中。写到头文件中可能提示编译错误