使用WM COPYDATA訊息通訊

2021-04-26 21:27:10 字數 1934 閱讀 6720

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

在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)

與前面所說的自定義訊息不一樣,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來得到。

經試驗,這種方法在系統cpu佔用率較高時可能會丟失資料!屬不可靠的方法.

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

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

QT5中,WM COPYDATA訊息丟失處理

之前利用nativeevent 截獲來著系統的訊息。發現有 wm copydata 訊息接收不到的問題。在操作下拉框之後,多麼奇怪的bug 後來查詢資料,有人說 資料處理太多,處理不及時,導致截獲訊息失敗 win32 wm copydata 訊息結構體 typedef struct tagcopyd...

程序通訊之一使用WM COPYDATA

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