Windows核心编程-多个应用程序实例间共享数据

多个应用程序实例间共享数据

Windows在一个Win32程序的地址空间周围筑了一道墙。通常,一个程序的地址空间中的数据是私有的,对别的程序而言是不可见的。但是在一个应用程序的多个实例间共享数据还是有简单的方法的。当您在一个应用程序实例中修改数据,这种改变将立即反映在其他的应用程序实例中。

正常的应用程序其数据和代码段都是在独立的段中,启动多个程序时,静态变量等数据都是独立的,不能用来在多个实例间共享数据。其独立的原因是因为系统给它们提供的默认段不具备共享功能。而我们可以在程序中手动指定共享的数据段,这样就可以直接在多个应用程序实例间共享数据了。
下面我用一个事例来直接说明

/************************************************************************/
/*         转载请注明文章来自:http://blog.csdn.net/windows_nt		    */
/*				    在多个应用程序实例间共享数据						*/
/************************************************************************/

#include <Windows.h>
#include <iostream>

// Tell the compiler to put this initialized variable in its own Shared 
// section so it is shared by all instances of this application.
#pragma data_seg("Shared")
volatile LONG g_lApplicationInstances = 0;
#pragma data_seg()

// Tell the linker to make the Shared section readable, writable, and shared.
#pragma comment(linker, "/Section:Shared,RWS")


void main ()
{
	// There is another instance of this application running
	InterlockedExchangeAdd(&g_lApplicationInstances, 1);

	printf("这是第 %d 个应用程序实例。\r\n", g_lApplicationInstances);

	printf("你现在可以启动新的应用程序实例来测试数据了。\r\n");

	getchar();
	// This instance of the application is terminating
	InterlockedExchangeAdd(&g_lApplicationInstances, -1);

	return;
}

说明:

      第一个#pragma叙述建立数据段,这里命名为shared。您可以将这段命名为任何一个您喜欢的名字。在这里的#pragma叙述之后的所有初始化了的变量都放在shared数据段中。
      第二个#pragma叙述标示段的结束。对变量进行专门的初始化是很重要的,否则编译器将把它们放在普通的未初始化数据段中而不是放在shared中。
      连结器必须知道有一个「shared」共享数据段。可以直接用DLL原始码指定连结选项,就像这样:
#pragma comment(linker,"/SECTION:shared,RWS")        字母RWS表示段具有读、写和共享属性。

应用场合:
    1.#pragma data_seg()一般用于DLL中。也就是说,在DLL中定义一个共享的,有名字的数据段。最关键的是:这个数据段中的全局变量可以被多个进程共享。否则多个进程之间无法共享DLL中的全局变量。
    2.共享数据必须初始化,否则微软编译器会把没有初始化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败。


 

你可能感兴趣的:(Windows核心编程-多个应用程序实例间共享数据)