使用 WM COPYDATA 在程序間共享資料

2022-03-16 05:43:53 字數 1247 閱讀 6232

訊息作用:

在程序間共享資料(內部通過建立記憶體對映檔案)

訊息介紹:

需要用到的資料結構/型別:

typedef

struct

tagcopydatastruct copydatastruct, *pcopydatastruct;

結構體引數說明:

dwdata(ulong) 儲存乙個數值, 可以用來作標誌等

lpdata(

void*) 待傳送的資料的起始位址(可以為null)

cbdata(dword) 待傳送的資料的長度

訊息的引數:

hwnd: 接收資料的視窗的控制代碼

wparam: 傳送該資料的視窗控制代碼(null也無所謂)

lparam: copydatastruct型別變數的位址

使用示例:

copydatastruct cds;

char msg = "

女孩不哭";

cds.dwdata = 0

; cds.lpdata =msg;

cds.cbdata = strlen(msg)+1; //

字串請記得把'\0'加上, 不然就錯了, 這裡是ansi字串

sendmessage(findwindow("

nbsg_class

", null), wm_copydata, 0, (lparam)&cds);

接收端對該訊息的一種可能處理:

case

wm_copydata:

說明:傳送的資料可以是任意的, 我上面只是為了用messagebox做測試, 所以傳送的是以'\0'的字串.

如果接收訊息的應用程式處理了該訊息, 它應該返回 true , 否則返回 false.

lpdata 指向的記憶體應該是一段"資料

", 就是說裡面不應該有指向該程式某資料的指標. 因為 sendmessage 在處理 wm_copydata 時, 只是把 lpdata 指向的 cbdata 個位元組複製到共享記憶體中. 當前程序私有的指標就算是被傳送到接收程式, 其也是無法訪問的.

當該訊息正當傳送時, 該程序的其它執行緒不能修改其中的資料.

接收端應用程式應該把這段共享記憶體作為唯讀記憶體來訪問. 請不要嘗試修改其中的內容.

lparam 指向的資料只有在該訊息處理時有效, 訊息返回後無效(共享記憶體已被釋放). 且接收端也不能釋放該記憶體. 如果要在訊息返回後繼續取得資料, 可以把它複製到當前程序的某個位置.

程序通訊之一使用WM COPYDATA

程序間通訊最簡單的方式就是傳送wm copydata訊息。傳送wm copydata訊息 sendmessage 接收視窗控制代碼,wm copydata,wparam 傳送視窗控制代碼,lparam data 其中的copydata 為copydatastruct 結構型別,該結構定義如下 typ...

程序通訊 使用WM COPYDATA訊息通訊

使用wm copydata訊息通訊 對於少量資料可以用wm copydata方便地實現通訊。由於sendmessage 是阻塞的,只有接收方響應了訊息,sendmessage 才能返回,否則一直阻塞。所以,對於大量資料來說,用sendmessage 就容易造成視窗假死。通過wm copydata訊息...

用WM COPYDATA實現程序通訊

用wm copydata的前提 1,知道接收訊息程序的控制代碼。2,接收訊息程序過載了wm copydata訊息對映 傳送端 void csenddlg onbnclickedsend 接收端 宣告afx msg bool oncopydata cwnd pwnd,copydatastruct pc...