默认情况下,所有的数据段都是进程独立的,每个进程有自己的一份。但有时候进程共享一个数据段也是有需要的,为此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)则根本不能编译成功,所以只要了解语法修改就可以了,不存在潜在危险。
??
时间: 2024-10-08 13:54:55