默认情况下,同一个exe文件或dll的多个实例之间不会共享全局或静态数据。 windows没有提供一种简便的方法来检查用户是否在运行同一个应用程序的多个实例。如果应用程序的多个实例能够共享同一个全局变量,那么我们就可以用这个变量来保存正在运行的实例的数量。通过这个方法可以控制当前运行的进程实例数量。
每个exe文件或dll文件映像有许多段组成,每个标准的段名都以点号开始。如代码放在名为.text的段中,未初始化的数据放在.bss段中,以初始化的数据放在.data段中。每个段都有几种属性:READ, WRITE, EXECUTE, SHARED。其中SHARED属性就是将要用来实现多实例共享数据的方法。除了使用编译器和链接器所创建的标准段外,我们还可以在编译的时候创建自己的段。例如我们创建一个名为“Shared“的段,它只包含一个LONG变量。
#pragma data_seg("Shared")
volatile LONG g_lApplicationInstances = 0;
#pragma data_seg()
需要注意的是编译器只会将已初始化的变量保存在这个段中。此外visual c++ 还提供了一个allocate声明符,它允许我们将未初始化的数据放到我们想放的任何段中。例如:
_declspec (allocate("Shared")) int c = 0; 其中的段必须是已经存在的。
有了上面这种方法,我们就可以把那些多个实例间共享的变量放在一个单独的段中。一旦把变量放到了单独的段中,系统就不会再在同一个可执行文件或dll的每个实例为它们创建新的实例了。为了共享变量,我们还必须告诉链接器要共享这个段中的变量。可以通过在链接器的命令行中使用/SECTION开关来实现:/SECTION: name, attributes。name指定段名,attrib