多個應用程式執行個體間共用資料
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 runningInterlockedExchangeAdd(&g_lApplicationInstances, 1);printf("這是第 %d 個應用程式執行個體。\r\n", g_lApplicationInstances);printf("你現在可以啟動新的應用程式執行個體來測試資料了。\r\n");getchar();// This instance of the application is terminatingInterlockedExchangeAdd(&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段中,從而導致多個進程之間的共用行為失敗。