pragma comment(linker,"/SECTION:shared,RWS")
Windows在一个Win32程序的地址空间周围筑了一道墙。一般,一个程序的地址空间中的数据是私有的,对别的程序而言是不可见的。可是执行多个执行实体表示了程序的全部执行实体之间共享数据是毫无问题的。当您在一个窗口中增长或者删除一个字符串时,这种改变将当即反映在其它的窗口中。 在所有例程之间,STRLIB共享两个变量:一个字符数组和一个整数(记录已储存的有效字符串的个数)。这两个变量储存在共享的一个特殊内存区段中: #pragma data_seg ("shared") int iTotal = 0; WCHAR szStrings [MAX_STRINGS][MAX_LENGTH + 1] = {'\0'}; #pragma data_seg () 第一个#pragma叙述创建数据段,这里命名为shared。您能够将这段命名为任何一个您喜欢的名字。在这里的#pragma叙述以后的全部初始化了的变量都放在shared数据段中。 第二个#pragma叙述标示段的结束。对变量进行专门的初始化是很重要的,不然编译器将把它们放在普通的未初始化数据段中而不是放在shared中。 连结器必须知道有一个「shared」共享数据段。能够直接用DLL原始码指定连结选项,就像这样: #pragma comment(linker,"/SECTION:shared,RWS") 字母RWS表示段具备读、写和共享属性。 共享的内存段容许iTotal变量和szStrings字符串数组在该程序全部例程之间共享。由于MAX_STRINGS等于256,而MAX_LENGTH等于63,因此,共享内存段的长度为32,772字节-iTotal变量须要4字节,256个指针中的每个都须要128字节。 1.#pragma data_seg()通常用于DLL中。也就是说,在DLL中定义一个共享的,有名字的数据段。最关键的是:这个数据段中的全局变量能够被多个进程共享。不然多个进程之间没法共享DLL中的全局变量。 2.共享数据必须初始化,不然微软编译器会把没有初始化的数据放到.BSS段中,从而致使多个进程之间的共享行为失败。 下面看一个实际应用,用共享数据来统计应用程序启动的次数,并做相应的处理。 在应用程序的入口处: //控制应用程序只能启动一次 #pragma data_seg("flag_data") int count=0; #pragma data_seg() #pragma comment(linker,"/SECTION:flag_data,RWS") if(count>1) { MessageBox("已经启动了一个应用程序","Warning",MB_OK); return FLASE; } count++;