进程间通信的WM_COPYDATA的使用

时间:2023-03-09 21:26:35
进程间通信的WM_COPYDATA的使用

http://blog.csdn.net/ao929929fei/article/details/6316174

接收数据的一方

ON_WM_COPYDATA()

afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);

代码片段:

  1. BOOL CClientDemoDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
  2. {
  3. if (pCopyDataStruct != NULL)
  4. {
  5. LPCTSTR pszText = (LPCTSTR)(pCopyDataStruct->lpData);
  6. DWORD dwLength = (DWORD)(pCopyDataStruct->cbData);
  7. TCHAR szRecvText[1024] = {0};
  8. memcpy(szRecvText, pszText, dwLength);
  9. MessageBox(szRecvText, _T("Test"), MB_OK);
  10. }
  11. return CDialog::OnCopyData(pWnd, pCopyDataStruct);
  12. }

发送数据的一方

代码片段:

  1. CString strWindowTitle =  _T("ClientDemo");
  2. CString strDataToSend = _T("Hello, Everyone fsdfsdfsdfdsfds,this is a test demo!");
  3. HWND hOtherWnd = ::FindWindow(NULL, strWindowTitle.GetBuffer(0));
  4. if (hOtherWnd != NULL && ::IsWindow(hOtherWnd))
  5. {
  6. COPYDATASTRUCT cpd;
  7. cpd.dwData = 0;
  8. cpd.cbData = strDataToSend.GetLength() * sizeof(TCHAR);
  9. cpd.lpData = (void*)strDataToSend.GetBuffer(0);
  10. HRESULT hResult = ::SendMessage(hOtherWnd, WM_COPYDATA, (WPARAM)(AfxGetApp()->m_pMainWnd), (LPARAM)&cpd);
  11. strDataToSend.ReleaseBuffer();
  12. }

OK了,就这么简单

WM_COPYDATA消息主要目的是允许在进程间传递少量只读数据。SDK文档推荐用户使用SendMessage()函数,接收方在数据复制完成前不返回,这样发送方就不可能删除和修改数据。