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

  原理:

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

    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--; }

 

 

你可能感兴趣的:(编译器,linker)