通过WM_COPYDATA消息完成进程间通信
通過WM_COPYDATA消息完成進(jìn)程間通信
完成進(jìn)程間通信最簡單的方式就是發(fā)送WM_COPYDATA消息。
(1)發(fā)送WM_COPYDATA消息
SendMessage(接收窗口句柄, WM_COPYDATA, (WPARAM)發(fā)送窗口句柄, (LPARAM)©Data);
其中的copyData是要發(fā)送的數(shù)據(jù),類型為COPYDATASTRUCT結(jié)構(gòu)體:
typedef struct tagCOPYDATASTRUCT
{?
DWORD dwData;??
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT;
?
dwData : Specifies up to 32 bits of data to be passed to the receiving application.
cbData : Specifies the size, in bytes, of the data pointed to by the lpData member.
lpData : Long pointer to data to be passed to the receiving application. This member can be NULL.
該消息只能由SendMessage()發(fā)送,而不能使用PostMessage()。因?yàn)橄到y(tǒng)必須管理用以傳遞數(shù)據(jù)的緩沖區(qū)的生命期,如果使用了PostMessage(),數(shù)據(jù)緩沖區(qū)會在接收方(線程)有機(jī)會處理該數(shù)據(jù)之前,就被系統(tǒng)清除和回收。
如果傳入的接收窗口句柄無效或者當(dāng)接收方進(jìn)程意外終止時,SendMessage()會立即返回,發(fā)送方不會陷入一個無窮等待的狀態(tài)中。
此外還需注意:
1.所發(fā)送的數(shù)據(jù)不能包含數(shù)據(jù)接收方無法訪問的指針或?qū)ο笠?#xff09;
2.消息發(fā)送后,要保證lpData所引用數(shù)據(jù)不能被其它線程修改(直到SendMessage函數(shù)返回))
示例代碼片段(MFC):
HWND receiveWindow = ::FindWindow(NULL, "CopyDataReceiver"); if (receiveWindow == NULL) return; CString sendData; GetDlgItemText(IDC_EDIT_SEND, sendData);COPYDATASTRUCT copyData = { 0 }; copyData.lpData = sendData.GetBuffer(); copyData.cbData = sendData.GetLength();::SendMessage(receiveWindow, WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)©Data);sendData.ReleaseBuffer();(2)接收WM_COPYDATA消息:
WM_COPYDATA
wParam = (WPARAM)(HWND) hwnd;
lParam = (LPARAM)(PCOPYDATASTRUCT) pcds;
lParam包含了接收到的數(shù)據(jù),在處理之前需要將類型轉(zhuǎn)換為COPYDATASTRUCT結(jié)構(gòu)體。接收方應(yīng)認(rèn)為這些數(shù)據(jù)是只讀的,并且只在處理該消息的過程中有效。如果想修改這些數(shù)據(jù),應(yīng)該把它們復(fù)制到本地buffer。
由于發(fā)送方在接收方處理WM_COPYDATA消息完畢前都是處于等待(SendMessage阻塞)中,所以接收方應(yīng)當(dāng)盡快處理WM_COPYDATA消息。
示例代碼片段(MFC):
BOOL CCopyDataReceiverDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) {if (pCopyDataStruct->cbData > 0){char recvData[256] = {0} ;strncpy(recvData, (char *)pCopyDataStruct->lpData, pCopyDataStruct->cbData);SetDlgItemText(IDC_EDIT_RECEIVE, (char *)recvData);}return CDialog::OnCopyData(pWnd, pCopyDataStruct); }總結(jié)
以上是生活随笔為你收集整理的通过WM_COPYDATA消息完成进程间通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一分钟学会使用RichEdit控件
- 下一篇: 不错的博客