出處:windows應用程式**核心程式設計
本文**於
程序通訊——使用wm_copydata訊息通訊
3.4 使用wm_copydata訊息通訊
對於少量資料可以用wm_copydata方便地實現通訊。由於sendmessage()是阻塞的,只有接收方響應了訊息,sendmessage()才能返回,否則一直阻塞。所以,對於大量資料來說,用sendmessage()就容易造成視窗假死。
3.4.1 通過wm_copydata訊息實現程序間通訊的方法
在win32中,wm_copydata訊息主要目的是允許在程序間傳遞唯讀資料。sdk文件推薦使用者使用sendmessage()函式,接收方在資料複製完成前不返回,這樣傳送方就不可能刪除和修改資料。這個函式的原型如下:
sendmessage(wm_copydata,wparam,lparam)
其中wparam設定為包含資料的視窗控制代碼,lparam指向乙個copydatastruct的結構,其定義為:
typedef struct tagcopydatastructcopydatastruct;
其中dwdata為自定義資料, cbdata為資料大小, lpdata為指向資料的指標。需要注意的是,wm_copydata訊息保證傳送的資料從原程序複製到目標程序。但是,wm_copydata訊息不能傳送hdc、hbitmap之類的東西,它們對於目標程序來說是無效的。目標程序得到這些資料不能在原程序作任何事情,因為它們屬於不同的程序。
與其他程序通訊方法一樣,要實現程序間的資料通訊,在傳送資料的程式中,首先要找到接收資料程序的視窗控制代碼pwnd,可以用cwnd::findwindow(null,_ t("datarecv"))函式來得到,其中字串"datarecv"為接收資料的程式名。然後用sendmessage()函式傳送資料,其具體的做法見後面的例項。
在接收資料的程式中,首先在訊息對映表中增加wm_copydata訊息對映,然後定義訊息對映函式,其函式的格式為:
bool cdatarecvdlg::oncopydata(cwnd* pwnd, copydatastruct* pcopydatastruct)
3.4.2 通過wm_copydata訊息實現程序間通訊的例項
與前面所說的自定義訊息不一樣,wm_copydata訊息是win32提供的訊息。與自定義訊息相比較,wm_copydata訊息可以傳遞乙個較大的資料塊。這裡仍然用兩個對話方塊程式來實現wm_copydata訊息的通訊。
以下分別給出傳送資料程式的傳送函式和接收資料程式的接收函式。在傳送資料的對話方塊類cdatasenddlg中,用mfc classwizard工具或者手工的方法增加函式void cdatasenddlg::onsendcopydata(),其具體**如下:
void cdatasenddlg::onsendcopydata()
copydatastruct cpd;
// 給copydatastruct結構賦值
cpd.dwdata = 0;
cpd.cbdata = m_strcopydata.getlength();
cpd.lpdata = (void*)m_strcopydata.getbuffer(cpd.cbdata);
pwnd->sendmessage(wm_copydata,null,(lparam)&cpd);
// 傳送 }
wm_copydata訊息的對映如下:
begin_message_map(cdatarecvdlg, cdialog)
//}afx_msg_map
end_message_map()
cdatarecvdlg::oncopydata()函式的定義如下:
bool cdatarecvdlg::oncopydata(cwnd* pwnd, copydatastruct* pcopydatastruct)
其中m_strcopydata為接收到的字串,pcopydatastruct為copydatastruct結構指標。注意由pcopydatastruct直接得到的m_strcopydata字串長度可能不是實際傳送的字串長度,需要用傳送字串時所給定的字串長度來進一步確定,其長度由pcopydatastruct ->cbdata來得到。
wm_copydata實現程序間資料共享
實現程序間資料共享除了常用的記憶體檔案對映外,對於一些非檔案的資料共享可以直接使用訊息wm_copydata。
如果需要在程序a傳遞資料到程序b,簡單的實現如下:
在程序a中:
cstring strdatatosend = _t( "hello" );
//需要傳遞的資料
hwnd hwndreceived;
//程序b的接收資料視窗物件
//copydatastruct結構是wm_copydata傳遞的資料結構物件
copydatastruct cpd;
cpd.dwdata =
0;cpd.cbdata
= strdatatosend.getlength();
//傳遞的資料長度
cpd.lpdata
= (void*)strdatatosend.getbuffer(cpd.cbdata);
//傳遞的資料位址
sendmessage( hwndreceived, wm_copydata, 0, (lparam) & cpd );
strdatatosend.releasebuffer();
在目標程序b中,先手動建立好函式宣告和實現
begin_message_map(cmywnd, cwnd)
//}afx_msg_map
end_message_map()
對映函式:
bool cmywnd::oncopydata(cwnd* pwnd, copydatastruct* pcopydatastruct)
還可以參考msdn文章using data copy
c++ builder 6 下實現
typedef
struct
msgstruct
msgstruct;
void
__fastcall tmainform::buttonsclick(tobject *sender)
else
messagebox(handle,
"找不到目標視窗!"
, "錯誤訊息"
, mb_iconerror | mb_ok); }
lresult
callback wndproc(
hwnd
hwnd,
uint
message,
wparam
wparam,
lparam
lparam)
break
;
case
wm_destroy:
postquitmessage(0);
break
;
default
:
return
defwindowproc(hwnd, message, wparam, lparam);
} return
0; }
用WM COPYDATA實現程序通訊
用wm copydata的前提 1,知道接收訊息程序的控制代碼。2,接收訊息程序過載了wm copydata訊息對映 傳送端 void csenddlg onbnclickedsend 接收端 宣告afx msg bool oncopydata cwnd pwnd,copydatastruct pc...
WM COPYDATA 程序間傳遞引數的問題
我們首先定義下面的結構,define buffer size max path 4 struct for loading report typedef struct report info report info,preport info 注意report info結構中的字元為字元陣列,這樣可以保...
使用 WM COPYDATA 在程序間共享資料
訊息作用 在程序間共享資料 內部通過建立記憶體對映檔案 訊息介紹 需要用到的資料結構 型別 typedef struct tagcopydatastruct copydatastruct,pcopydatastruct 結構體引數說明 dwdata ulong 儲存乙個數值,可以用來作標誌等 lpd...