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

2021-05-22 19:06:46 字數 1992 閱讀 4199

使用wm_copydata訊息通訊

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

通過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)

通過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來得到。

unix程序間通訊 使用管道通訊

使用管道需要注意以下4種特殊情況 假設都是阻塞i o操作,沒有設定o nonblock標誌 如果所有指向管道寫端的檔案描述符都關閉了 管道寫端的引用計數等於0 而仍然有程序從管道的讀端讀資料,那麼管道中剩餘的資料都被讀取後,再次read會返回0,就像讀到檔案末尾一樣。如果有指向管道寫端的檔案描述符沒...

程序間通訊 使用socket實現

socket套接字通訊,建立兩個程序交流 第乙個程序叫做jack,他想給rose打 於是他先要去買乙個手機 建立socket 並且還要知道rose的 號碼 對方ip和埠 jack 客戶端 如下 include include include include include include inclu...

Linux程序間通訊 使用匿名管道

在前面,介紹了一種程序間的通訊方式 使用訊號,我們建立通知事件,並通過它引起響應,但傳遞的資訊只是乙個訊號值。這裡將介紹另一種程序間通訊的方式 匿名管道,通過它程序間可以交換更多有用的資料。一 什麼是管道 如果你使用過linux的命令,那麼對於管道這個名詞你一定不會感覺到陌生,因為我們通常通過符號 ...