通过WM_COPYDATA消息完成进程间通信
通過WM_COPYDATA消息完成進程間通信
完成進程間通信最簡單的方式就是發送WM_COPYDATA消息。
(1)發送WM_COPYDATA消息
SendMessage(接收窗口句柄, WM_COPYDATA, (WPARAM)發送窗口句柄, (LPARAM)©Data);
其中的copyData是要發送的數據,類型為COPYDATASTRUCT結構體:
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()發送,而不能使用PostMessage()。因為系統必須管理用以傳遞數據的緩沖區的生命期,如果使用了PostMessage(),數據緩沖區會在接收方(線程)有機會處理該數據之前,就被系統清除和回收。
如果傳入的接收窗口句柄無效或者當接收方進程意外終止時,SendMessage()會立即返回,發送方不會陷入一個無窮等待的狀態中。
此外還需注意:
1.所發送的數據不能包含數據接收方無法訪問的指針或對象引用)
2.消息發送后,要保證lpData所引用數據不能被其它線程修改(直到SendMessage函數返回))
示例代碼片段(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包含了接收到的數據,在處理之前需要將類型轉換為COPYDATASTRUCT結構體。接收方應認為這些數據是只讀的,并且只在處理該消息的過程中有效。如果想修改這些數據,應該把它們復制到本地buffer。
由于發送方在接收方處理WM_COPYDATA消息完畢前都是處于等待(SendMessage阻塞)中,所以接收方應當盡快處理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); }總結
以上是生活随笔為你收集整理的通过WM_COPYDATA消息完成进程间通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一分钟学会使用RichEdit控件
- 下一篇: 不错的博客