3.6.2 使用dll通訊的方法從上面可以看出,對於win32的dll,所有載入dll的應用程式只能共享程式**,不能共享資料,必須要採取一種方法才能使這些程式之間共享資料。當然訪問資料時要注意同步問題。
要想使win32 dll的資料區能設計成共享的儲存區,可以通過#pragma
data_seg指令建立乙個新段來做到這一點,實際上是告訴編譯器包含段中的特定變數。然而,僅此不足以做到資料共享,還必須把段中將要共享的變數告訴聯結器。可通過如下命令來
實現:(1)指定def檔案在sections段下的名字,如下所示:
sections
共享段名 read write shared
(2)#pragma comment(linker,"/section: 共享段名,rws")
下面的例子示範了如何初始化乙個全域性變數:
#pragma data_seg("myshared")
uint m_glndata=0;
#pragma data_seg()
#pragma comment(linker,"/section:myshared,rws")
注意要初始化變數。初始化變數很重要,因為編譯器將把所有未初始化資料存放在.bss段。把變數安排在與使用者預期不同的段中,則它們就不能被共享,除非明確地指出要共享的是.bss段。
關於共享資料段名稱myshared,完全可以用其他的名稱,如mydata、.mysc等,但建議不要與pe檔案的固定的段名相同,以免程式執行時出錯。
最後一點要強調的是,進行通訊的程式要使用同乙個dll檔案。如果使用的是相同dll檔案的不同副本,則不能實現程序之間的通訊。
3.6.3 使用dll通訊的例項
與前面所講的通訊方法不同,本例項使用dll實現程序間的通訊。以下是乙個用於生成dll檔案的標頭檔案dllobj.h。其具體**如下:
// dllobj.h:標頭檔案
//#ifndef _dllobj_h_included
#define _dllobj_h_included
#include #ifdef _cplusplus
#define _dllcom_ extern "c" _declspec (dllexport)
#else
#define _dllcom_ _declspec (dllexport)
#endif
_dllcom_lpstr getvaluestring();
_dllcom_void setvaluestring(lpcstr str);
#endif
其中setvaluestring()和getvaluestring()函式分別用於向所指定的共享儲存區里寫入和讀取字串。_dllcom_
用於定義dll中函式的輸出。可以看出,setvaluestring()和getvaluestring()函式的寫法與其他dll檔案的寫法沒有什麼不同。但是,這兩個函式所用到的共用字串變數m_strstring的表示方法則是用dll實現記憶體資料共享的關鍵。
模板(可以取其他的名稱),然後把以下的**包含在乙個dllcom.cpp檔案中,再用vc++編譯器進行編譯和連線,就可以生成dllcom.dll和dllcom.lib檔案。生成這個dll檔案的核心**如下:
#pragma data_seg("myshared")
char m_strstring[256]=text("");
volatile bool bincriticalsection=false;
#pragma data_seg()
#pragma comment(linker,"/section:myshared,rws")
ccriticalsection cs;
// 從記憶體中讀取字串
_dllcom_ lpstr getvaluestring()
// 把字串儲存到共享記憶體中
_dllcom_ void setvaluestring(lpcstr str)
其中bincriticalsection為程序訪問資料時的同步標識。
在製作了乙個用於程序間通訊的dll檔案後,就可以利用它實現程序之間的通訊。可以設計兩個應用程式,dlluser1和dlluser2,在這兩個程式中把動態庫檔案頭dllobj.h和動態庫dllcom.lib包含其中,即
#include "dllobj.h"
#pragma comment(lib,"dllcom.lib")
然後,用mfcvc++編譯器進行編譯和連線,這樣就可以用setvaluestring()和getvalue-string()函式進行通訊了。
程序間通訊 DLL共享節
dll共享節技術可以讓使用同乙個dll的多個程序共享一塊記憶體 共享節 下面我通過乙個專案來演示使用方法。首先準備乙個受害者程式,我選用了xp的掃雷,您也可以用任意喜歡的程式。然後,編寫dll,dll中需要設定共享節,然後在本專案中,dll被注入到掃雷程序,然後迴圈列印共享節中的資料,這個資料可以被...
C WM COPYDATA 實現程序通訊
基於mfc 用於儲存資料的自定義結構體 struct msg struct 傳送端,傳送按鈕響應事件的 void csendwm copydatadlg onbnclickedsendmessage 接收端,響應wm copydata的 bool creceivewm copydatadlg onc...
c 實現dll注入其它程序
dll注入技術才具有強大的功能和使用性,同時簡單易用,因為dll中可以實現複雜的功能和很多的技術。技術要點 1 宿主程序呼叫loadlibrary,就可以完成dll的遠端注入。可以通過createremotethread將loadlibrary作為宿主程序的乙個執行緒來啟動,就可以完成 控制目標程序...