dll實現程序通訊

2021-06-28 03:13:14 字數 2270 閱讀 7013

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作為宿主程序的乙個執行緒來啟動,就可以完成 控制目標程序...