DLL載入記憶體的問題
在Win32環境下,所有程序的空間都是相互獨立的,這減少了應用程式間的相互影響,但大大增加了程式設計的難度。當程序在動態載入DLL時,系統自動把DLL地址對映到該程序的私有空間,而且也複製該DLL的全域性資料的一份拷貝到該程序空間,每個程序所擁有的相同的DLL的全域性資料其值卻並不一定是相同的。當DLL記憶體被對映到程序空間中,每個程序都有自己的全域性記憶體拷貝,載入DLL的每一個新的程序都重新初始化這一記憶體區域,也就是說程序不能再共享DLL。因此,在Win32環境下要想在多個程序中共享資料,就必須進行必要的設定。一種方法便是把這些需要共享的資料單獨分離出來,放置在一個獨立的資料段裡,並把該段的屬性設定為共享,建立一個記憶體共享的DLL。
WINDOWS中要使用記憶體共享的方式在程序間通訊需要採用DLL方式。由於WIN32把DLL裝入全域性記憶體並把DLL對映到每個程式的地址空間。所有載入DLL的應用程式只能共享程式程式碼,不能共享資料。要想使DLL的資料區能設計成共享的儲存區,可以通過#pragma data_seg指令來建立一個新段來做完成。
四、全域性共享資料的實現
可以用#pragma data_seg建立一個新的資料段並定義共享資料,其具體格式為:
#pragma data_seg ("shareddata")
HWND sharedwnd=NULL;//共享資料
#pragma data_seg()
所有在data_seg pragmas語句之間宣告的變數都將在shareddata段中。僅定義一個數據段還不能達到共享資料的目的,還要告訴編譯器該段的
屬性,有兩種方法可以實現該目的(其效果是相同的),一種方法是在.DEF檔案中加入如下語句:
SETCTIONS
shareddata READ WRITE SHARED
另一種方法是在專案設定連結選項中加入如下語句:
/SECTION:shareddata,rws