windows DLL共享變量

在Windows中同一個dll或者可執(zhí)行文件的多個實例之間的全局靜態(tài)變量是獨立的(Linux中動態(tài)鏈接庫可以共享全局變量的),不存在共享全局或者靜態(tài)變量,這樣的設計是為了安全考慮,但是有時候在dll見共享變量也會帶來很多方便。最近在項目中編寫log收集模塊,使用的是第三方庫log4cplus,項目有兩個進程,希望兩個進程的log都寫到一個文件,所以想在兩個進程之間共享一個log instance,但是windows卻沒有提供直接共享靜態(tài)變量的機制,所以就另尋他法。windows其實提供了一種共享的方式。

我們知道一個dll或者exe文件映像是由很多段組成的,常見的有.text段用來存放代碼,.bss段存放那些沒有被初始化的數(shù)據(jù),.data段用來存放那些已經(jīng)初始化的數(shù)據(jù),當然還有其他一些段。VS里有個Dumpbin工具可以查看各個段的基本信息。除了這些標準段外,windows允許我們創(chuàng)建自己的段,在編譯的時候使用#pragma data_seg的方式可以創(chuàng)建自己的段。

#pragma data_seg("Shared")

int sharedobject = 0;

#pragma data_seg()

上面三行就是完整的在代碼中添加段的過程,首先#pragma data_seg()兩種用途,一個是告訴編譯器新增加的段的名字,另外一個就是告訴編譯編譯器新增加的段的結束位置,這兩個之間的已初始化變量的將被寫到新增加的段中。需要非常注意的一點是編譯器只會把已經(jīng)顯式初始化的全局變量放到Shared段中,如果沒有初始化編譯器會將該變量放到shared段以外的其他段中。

Microsoft Visual C++編譯器提供了一個allocate聲明符,允許我們將未經(jīng)初始化的變量放到任何我們想要的段。

__declspec(allocate("Shared")) int shared;

那么要達到共享變量的目的,僅告訴編譯器把變量放到單獨的段中是不夠的,還需要在鏈接的時候告訴鏈接器共享這些變量,有兩種方式,一種是直接在鏈接命令行中添加/SECTION開關來實現(xiàn),這里我們可以用/SECTION:Shared, RWS,注意后面的那個RWS是用來告訴鏈接器這個區(qū)域是的屬性。另外一種通知編譯器的方法是#pragma comment(linker, "/SECTION:Shared,RWS").

但是有一點非常重要,使用自己添加段的方式共享變量并不是一種安全的方式,會導致一些潛在的安全漏洞,所以我最后還是選擇了共享內(nèi)存的方式傳輸這些需要的數(shù)據(jù)~~

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容