#pragma data_seg() 共享資料// MyData段 // 程式 // DLL

清風oo發表於2019-03-12

https://www.cnblogs.com/dongsheng/p/4476157.html

http://www.cnblogs.com/CBDoctor/archive/2013/01/26/2878201.html

https://www.cnblogs.com/wwb0111/archive/2012/05/26/3098963.html

#pragma data_seg()一般用於DLL中

在DLL中定義一個共享的,有名字的資料段

最關鍵的是:這個資料段中的全域性變數可以被多個程式共享。否則多個程式之間無法共享DLL中的全域性變數

共享資料必須初始化,否則微軟編譯器會把沒有初始化的資料放到.BSS段中,從而導致多個程式之間的共享行為失敗

MyData段

程式

DLL

 

Windows 在一個Win32程式的地址空間周圍築了一道牆。通常,一個程式的地址空間中的資料是私有的,對別的

程式而言是不可見的。但是執行STRPROG的多個執行實體表示了STRLIB在程式的所有執行實體之間共享資料是

毫無問題的。當您在一個STRPROG視窗中增加或者刪除一個字串時,這種改變將立即反映在其它的視窗中。

在全部例程之間,STRLIB共享兩個變數:一個字元陣列和一個整數(記錄已儲存的有效字串的個數)。STRLIB

將這兩個變數儲存在共享的一個特殊記憶體區段中:

#pragma      data_seg ("shared")        

 int    iTotal = 0 ;        

 WCHAR  szStrings [MAX_STRINGS][MAX_LENGTH + 1] = { '\0' } ;         

 #pragma      data_seg ()        

第一個#pragma敘述建立資料段,這裡命名為shared。您可以將這段命名為任何一個您喜歡的名字。在這裡的#pragma敘述之後的所有初始化了的變數都放在shared資料段中。第二個#pragma敘述標示段的結束。對變數進行專門的初始化是很重要的,否則編譯器將把它們放在普通的未初始化資料段中而不是放在shared中。

連結器必須知道有一個「shared」共享資料段。在「Project Settings」對話方塊選擇「Link」頁面卷標。選中「STRLIB」時在「Project Options」欄位(在Release和Debug設定中均可),包含下面的連結敘述:

/SECTION:shared,RWS        

字母RWS表示段具有讀、寫和共享屬性。或者,您也可以直接用DLL原始碼指定連結選項,就像我們在STRLIB.C那樣(《windows程式設計》教程動態連結庫):

#pragma comment(linker,"/SECTION:shared,RWS")        

共享的記憶體段允許iTotal變數和szStrings字串陣列在STRLIB的所有例程之間共享。因為MAX_STRINGS等於256,而 MAX_LENGTH等於63,所以,共享記憶體段的長度為32,772位元組-iTotal變數需要4位元組,256個指標中的每一個都需要128位元組。

相關文章