1. 程式人生 > >DLL載入記憶體的問題

DLL載入記憶體的問題

在Win32環境下,所有程序的空間都是相互獨立的,這減少了應用程式間的相互影響,但大大增加了程式設計的難度。當程序在動態載入DLL時,系統自動把DLL地址對映到該程序的私有空間,而且也複製該DLL的全域性資料的一份拷貝到該程序空間,每個程序所擁有的相同的DLL的全域性資料其值卻並不一定是相同的。當DLL記憶體被對映到程序空間中,每個程序都有自己的全域性記憶體拷貝,載入DLL的每一個新的程序都重新初始化這一記憶體區域,也就是說程序不能再共享DLL。因此,在Win32環境下要想在多個程序中共享資料,就必須進行必要的設定。一種方法便是把這些需要共享的資料單獨分離出來,放置在一個獨立的資料段裡,並把該段的屬性設定為共享,建立一個記憶體共享的DLL。

WINDOWS中要使用記憶體共享的方式在程序間通訊需要採用DLL方式。由於WIN32DLL裝入全域性記憶體並把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