读书人

用内存储器映射文件实现应用程序只运行

发布时间: 2012-11-07 09:56:10 作者: rapoo

用内存映射文件实现应用程序只运行一个实例

原理:

如果一个应用程序的实例已经运行,那么当再运行一个实例时,系统只会为这个实例创建一个新的内存映射视图,这个内存映射视图会被映射到第一个实例所映射的虚拟内存中,这样就可以在多个实例之间共享内存中的代码和数据,可以通过数据来控制运行实例的个数即可。当然,要实现多个实例的数据共享,不是简单的使用全局变量就行了,应用程序的文件映像会被分到不同的段中:

READ:可读数据段

WRITE:可写数据段

EXECUTE:可执行数据段

SHARED:该段的内容会被多个实例共享

编译器在默认情况下,数据都不会被放到SHARED中,要想把数据发到该段中,需要特别告诉给编译器,用2种方法:

方式1 #pragma data_seg("Shared")
int g_iAppInstance=1;
#pragma data_seg()

#pragma data_seg("name"),当编译器执行到这句时,会将其之下出现的已经初始化的变量放到shared段中

#pragma data_seg(),表示恢复默认

方式2

#pragma data_seg("Shared")

__declspec(allocate("Shared")) int g_iAppInstance;
#pragma data_seg()

这个和方式1的区别是不需要初始化

除此之外,还要告诉连接器要共享这些变量:
#pragma comment(linker,"/SECTION:Shared,RWS")

示例代码如下:

#include <iostream>using namespace std;//1#pragma data_seg("Shared")int g_iAppInstance=1;#pragma data_seg()

//2// #pragma data_seg("Shared")// __declspec(allocate("Shared")) int g_iAppInstance;// #pragma data_seg()

#pragma comment(linker,"/SECTION:Shared,RWS")

void main(){ if(g_iAppInstance==1) { g_iAppInstance++; cout<<"I am running.\n"; system("pause"); } else { exit(1); } g_iAppInstance--;}

读书人网 >其他相关

热点推荐