正常来说,一个可执行文件运行多个实例,这些实例不会共享可执行文件中的全局和静态变量。因为Windows通过写时复制机制来保证各个进程的全局静态区互相独立,当然DLL中的全局和静态变量也是被这样处理的。当不同的进程将DLL映射到自己的内存空间时,系统会为那些全局和静态变量创建不同的实例。那进程间共享DLL全局变量是如何实现的呢??
我们可以在DLL中使用如下语句:
#pragma data_seg("KookNut")
来创建一个段,用来存放那些需要共享的数据,要记得初始化这些数据,并且设置链接器开关,使该段在所有映射DLL的进程中成为共享读写属性:
#pragma comment(linker,"/SECTION:KookNut,RWS")//告诉编译器共享读写
当我们DLL中的这个段废除了拷贝写机制之后,我们在一定意义上也就可以实现进程间的相互通信了,对同一个数据进行共享的读写访问,当然这样的设计有安全方面的漏洞,但在这里我们只是学习一下这种通信方法。
可以自己写两个进程加载动态库之后,进行测试,下面附上DLL中的函数和共享段代码: