一般來(lái)說(shuō),動(dòng)態(tài)鏈接庫(kù)在內(nèi)存中只會(huì)加載一次
每個(gè)進(jìn)程需要調(diào)用到次動(dòng)態(tài)鏈接庫(kù)的時(shí)候,都會(huì)從這一個(gè)內(nèi)存地址中加載
但,如果進(jìn)程需要改動(dòng)動(dòng)態(tài)鏈接庫(kù)中的信息,哪怕是全局變量,系統(tǒng)也會(huì)從內(nèi)存中重新分配出一小塊區(qū)域,來(lái)進(jìn)行這些變量的存儲(chǔ)
那么與之對(duì)應(yīng)的,每一個(gè)進(jìn)程,所修改的動(dòng)態(tài)鏈接庫(kù),只能是自己的一份,不能在所有進(jìn)程中共享的
如果想在所有進(jìn)程中共享一份動(dòng)態(tài)鏈接庫(kù)數(shù)據(jù),則需要在DLL中設(shè)置一個(gè)共享的 “段”。
以下代碼是定義一個(gè)節(jié)并給節(jié)命名為MySec,HWND g_hWnd=NULL;為將放在節(jié)中的數(shù)據(jù)
#pragma data_seg("MySec")
HWND g_hWnd=NULL;
#pragma data_seg()
注意:但是放在 MySec 段中的變量必須要被初始化。飛走而編譯器就會(huì)將該變量放到 MySec 段以外
的其他段中。
僅定義一個(gè)數(shù)據(jù)段還不能達(dá)到共享數(shù)據(jù)的目的,還要告訴編譯器該段的屬性,有兩種方法可以實(shí)現(xiàn)該目的(其效果是相同的),一種方法是在.DEF文件中加入如下語(yǔ)句:
SETCTIONS
MySec READ WRITE SHARED
另一種方法是在項(xiàng)目設(shè)置鏈接選項(xiàng)中加入如下語(yǔ)句:
/SECTION:shareddata,rws
RWS:r為讀,w為寫(xiě),s為共享
或者 使用一種更方便的方法,直接將連接器開(kāi)關(guān)嵌入到 dll 的源代碼中。
#pragma comment(linker,"/section:MySec,RWS")
posted on 2009-04-04 13:58
李陽(yáng) 閱讀(1108)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
C++