用內存映射文件實現應用程序只運行一個實例

  原理:

         如果一個應用程序的實例已經運行,那麼當再運行一個實例時,系統只會爲這個實例創建一個新的內存映射視圖,這個內存映射視圖會被映射到第一個實例所映射的虛擬內存中,這樣就可以在多個實例之間共享內存中的代碼和數據,可以通過數據來控制運行實例的個數即可。當然,要實現多個實例的數據共享,不是簡單的使用全局變量就行了,應用程序的文件映像會被分到不同的段中:

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章