DLL中建立进程共享数据段需要注意的语法问题

默认情况下,所有的数据段都是进程独立的,每个进程有自己的一份。但有时候进程共享一个数据段也是有需要的,为此VC++编译连接器提供了专门的语法,下面是一个典型的例子,建立了一个名为Shared的共享数据段,该数据段里只有一个变量g_hwndOwner。


////////////////////////////////////////////// 进程共享区 ///////////////////////////////////////
#pragma data_seg("Shared")
HWND g_hwndOwner = NULL;		// 调用SetWindowsHookEx的线程的主窗口
#pragma data_seg()
#pragma comment(linker, "/section:Shared,rws") // 可读,可写,进程间共享。所有加载此dll的进程共享一份内存


看似简单的东西,却往往很容易让我们犯错。下面是几个需要注意的语法问题:

(1)数据段的名称为“Shared”,那么在设置该段属性的时候,一定要保证段名称完全与“Shared”相同,而且大小写敏感。一旦两者不同,连接器会警告错误。

>LINK : warning LNK4039: 用 /SECTION 选项指定的节“Shar2ed”不存在。注意是警告错误,所以DLL文件会继续编译连接成功,只是Shared数据段并没有设置为共享段。


(2)共享段中的变量一定要初始化,否则连接器也会报错,也不能正常设置为共享段。

1>LINK : warning LNK4039: 用 /SECTION 选项指定的节“Shared”不存在。 但是继续生成dll文件。


(3)最后一行中的rws之前不能有空格,否则编译器报错。

1>main.obj : fatal error LNK1276: 找到无效的指令“rws”; 未以“/”开头。然后停止编译连接。


这三种错误,最严重的就是(1)和(2),因为虽然没有成功设置共享段,但是仍然编译成功,稍不注意,就会非常危险。对于(3)则根本不能编译成功,所以只要了解语法修改就可以了,不存在潜在危险。


??

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。