VC 应用间通信,WM_COPYDATA,WM_SETTEXT

1、使用 WM_COPYDATA 消息

发送数据的一方:(获得句柄的方法,最简单的方法就是使用FindWindow,找窗口类,或者名,如果你觉得这样不把握,那就利用SetProp个窗口做个记号....见文章“使用信号量找到窗口句柄”)

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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.     }    

接收数据的一方

ON_WM_COPYDATA()

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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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. }   

2、使用 WM_SETTEXT 消息

发送方:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CString str = _T( "Hello" );  
  2. HWND hWndReceived = FindWindow( "Receiver", NULL );  
  3. SendMessage( hWndReceived, WM_SETTEXT, 0, (LPARAM) str );  

接受方:

ON_MESSAGE( WM_SETTEXT, OnSetTextMsg )

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. afx_msg void OnSetTextMsg( WPARAM wParam, LPARAM lParam)  
  2. OnSetTextMsg( WPARAM wParam, LPARAM lParam )  
  3. {  
  4. char str[ 256 ];  
  5. wsprintf( str, "%s", (char*) lParam );  
  6. }
  7. 3、其他方法,如:使用内存映射文件 

  8. 通过共享内存DLL共享内存(进程间发送的内存需为完整的内存,不能在结构体中套结构体,不能让指针等于不完整的内存COPYDATASTRUCT* pCpd = new COPYDATASTRUCT;  
  9.             pCpd->dwData = 1;  
  10.             pCpd->cbData = sizeof(int) + mBackupDataPath.GetLength()*sizeof(TCHAR);  
  11.             pCpd->lpData = new BYTE[pCpd->cbData];     
  12.             *((int*)pCpd->lpData) = 1; //设置备份路径 1  
  13.             memcpy((LPVOID)((int*)pCpd->lpData + 1), mBackupDataPath.GetBuffer(0), mBackupDataPath.GetLength()*sizeof(TCHAR));  
  14.             ::SendMessage(callInstanceHwnd, WM_COPYDATA, NULL,(LPARAM)pCpd);  
  15.             mBackupDataPath.ReleaseBuffer();  
  16.             delete pCpd->lpData;  
  17.             delete pCpd;
  18. 4、 邮槽,剪切板,命令行

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值