1.:#pragmacomment(linker,"/section:Shared,rws")函数中的带双引号的参数不要有空格
2.dll被所有引用的程序释放后,再次被其他程序加载后共享段数据被重新初始化(出现不能共享的错觉)
--------------------------------------
下面来谈一下在具体使用共享数据段时需要注意的一些问题:
· 所有在共享数据段中的变量,只有在数据段中经过了初始化之后,才会是进程间共享的。如果没有初始化,那么进程间访问该变量则是未定义的。
· 所有的共享变量都要放置在共享数据段中。如何定义很大的数组,那么也会导致很大的DLL。
· 不要在共享数据段中存放进程相关的信息。Win32中大多数的数据结构和值(比如HANDLE)只在特定的进程上下文中才是有效地。
· 每个进程都有它自己的地址空间。因此不要在共享数据段中共享指针,指针指向的地址在不同的地址空间中是不一样的。
· DLL在每个进程中是被映射在不同的虚拟地址空间中的,因此函数指针也是不安全的。
http://www.cppblog.com/suiaiguo/archive/2009/07/21/90734.aspx?opt=admin
----------------------------------------
平台:windowsXPVC6sp6我编写了一个DLL,我希望通过以下代码向让nCount在所有加载该DLL的进程中共享变量nCount,但是事实上Share数据段并没有共享。我用IDApro看Share数据段的flag是:DataReadableWritable#pragmadata_seg("Shared")intnCount=0;#pragmadata_seg()#pragmacomment(linker,"/section:Shared,rws")//*然后,我换了个方法:在def文件中添加以下一句话,SECTIONSSharedREADWRITESHARED并把上面代码中*标示的那句删除,Share段就被共享了。IDApro显示中,flagataShareableReadableWritable请问为什么第一种方法达不到共享的目的?
网友回答:#pragmacomment(linker,"/section:Shared,rws")中间不要加空格
网友回答:"/section:Shared,rws"试试删除rws前面的空格
网友回答:多谢cdeee、zzz3265的确是因为这个空格的原因,我把空格去掉后,Share数据段就是共享的了。多谢!
阅读(2008) | 评论(0) | 转发(0) |