2013年1月8日 星期二

不同行程透過DLL共享資料


今天看了李維寫的"C++ Builder 程式設計要訣-精修篇",其中的 package 章節提到 DLL 無法達到不同行程間的資料交換,不過就我查考的資料在我的 Windows 2000 上可以透過 DLL共享資料,可能是作業系統的支援程度不一樣,因為書中出版的時間點是 Windows 95/NT 的時代,我並未在該版本的 Windows 上進行測試,也許當時 Microsoft 對於 DLL 的支援並不需要跨行程。回到主題,如果不同行程之間要透過 DLL 共享資料,必須在要共享的資料前後加上如下的宣告:
#pragma data_seg ("my_share_area")
int count = 0; 
#pragma data_seg()
#pragma comment(linker, "/SECTION:my_share_area,RWS")
#pragma data_seg 是用來宣告共享區段,#pragma comment 是告訴聯結器宣告區域具有讀(R)寫(W)共享(S)屬性。如此一來,不同行程載入這個 DLL 到自己的行程中,這個區域宣告的變數只會存在一份,所以,只要在公開的函數中存取該區域的變數,就可以達到在不同行程間的資料共享。附圖是我用 VC6 寫的 DLL,並用VB6, BCB6 和 C#寫的程式,顯示的數值是從 DLL 中取出的,每按一下按鈕DLL中的 count 值會遞增 1,可以透過這三個不同的程式來了解不同行程資料共享的可行性。
透過 DLL 來達到資源共享其實本質上也是透過記憶體映射檔來實現的。