进程间通信

WM_COPYDATA的使用


接收数据的一方

ON_WM_COPYDATA()

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

代码片段:

[cpp]  view plain copy
  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.   
  12.     return CDialog::OnCopyData(pWnd, pCopyDataStruct);  
  13. }  

 

发送数据的一方

代码片段:

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

 

1 发送消息的程序中比较简单,在要发送的地方加入如下代码就行了: 
void CSendDlg::OnSend() 

// TODO: Add your control notification handler code here 

CString str="这是我要发送的给另外一个进程字符串。"; 
COPYDATASTRUCT myCopyDATA; 
myCopyDATA.cbData=str.GetLength(); 
myCopyDATA.lpData=str.GetBuffer(0); 
str.ReleaseBuffer(); 
HWND hwnd=::FindWindow(NULL,"Receive"); //假设目标程序窗口标题为"Receive
if (hwnd) 
::SendMessage(hwnd,WM_COPYDATA,NULL,(LPARAM)&myCopyDATA); 
else 
AfxMessageBox("目标程序没有运行。"); 


2 接收消息的程序(这里假设是基于对话框的工程)请按如下步骤来实现: 
先给对话框类CReceiveDlg(如果你的接收程序为SDI工程的话,把CReceiveDlg类换成CMainFrame类)添加一个消息处理函数LRESULT OnReceive(WPARAM wParam,LPARAM lParam),代码如下: 
LRESULT CReceiveDlg::OnReceive(WPARAM wParam,LPARAM lParam) 

COPYDATASTRUCT *p = NULL ; 
p = (COPYDATASTRUCT*)lParam; 
CString strTemp; 
memcpy(strTemp.GetBuffer((int)p->cbData),p->lpData,p->cbData); 
strTemp.ReleaseBuffer(); 
AfxMessageBox(strTemp);
 
return 0; 

接着再给工程设定刚才添加的函数OnReceive为WM_COPYDATA消息的响应函数,在ReceiveDlg.cpp文件中如下地方加入一行代码: 
BEGIN_MESSAGE_MAP(CReceiveDlg, CDialog) 
//{{AFX_MSG_MAP(CReceiveDlg) 
ON_WM_PAINT() 
ON_WM_QUERYDRAGICON() 
ON_MESSAGE(WM_COPYDATA,OnReceive) //只要添加这一行进行WM_COPYDATA消息映射 
//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 


好了,现在分别运行两个程序,应该可以在A程序中给B程序发送消息了,B收到消息后会弹出个MessageBox来显示从A程序发送来消息了。



OK了,就这么简单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值