VC 应用间通信,WM_COPYDATA,WM_SETTEXT

1 篇文章 0 订阅

1、使用 WM_COPYDATA 消息

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

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

接收数据的一方

ON_WM_COPYDATA()

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

BOOL CClientDemoDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)  
{  
    if (pCopyDataStruct != NULL)  
    {  
        LPCTSTR pszText = (LPCTSTR)(pCopyDataStruct->lpData);  
        DWORD dwLength = (DWORD)(pCopyDataStruct->cbData);  
        TCHAR szRecvText[1024] = {0};  
        memcpy(szRecvText, pszText, dwLength);  
        MessageBox(szRecvText, _T("Test"), MB_OK);  
    }  
  
    return CDialog::OnCopyData(pWnd, pCopyDataStruct);  
} 

2、使用 WM_SETTEXT 消息

发送方:

CString str = _T( "Hello" );
HWND hWndReceived = FindWindow( "Receiver", NULL );
SendMessage( hWndReceived, WM_SETTEXT, 0, (LPARAM) str );

接受方:

ON_MESSAGE( WM_SETTEXT, OnSetTextMsg )

afx_msg void OnSetTextMsg( WPARAM wParam, LPARAM lParam)
OnSetTextMsg( WPARAM wParam, LPARAM lParam )
{
	char str[ 256 ];
	wsprintf( str, "%s", (char*) lParam );
 	MessageBox(str, _T("Test"), MB_OK);  
}




3、其他方法,如:

使用内存映射文件 
通过共享内存DLL共享内存 



进程间发送的内存需为完整的内存,不能在结构体中套结构体,不能让指针等于不完整的内存
COPYDATASTRUCT* pCpd = new COPYDATASTRUCT;
			pCpd->dwData = 1;
			pCpd->cbData = sizeof(int) + mBackupDataPath.GetLength()*sizeof(TCHAR);
			pCpd->lpData = new BYTE[pCpd->cbData];   
			*((int*)pCpd->lpData) = 1; //设置备份路径 1
			memcpy((LPVOID)((int*)pCpd->lpData + 1), mBackupDataPath.GetBuffer(0), mBackupDataPath.GetLength()*sizeof(TCHAR));
			::SendMessage(callInstanceHwnd, WM_COPYDATA, NULL,(LPARAM)pCpd);
			mBackupDataPath.ReleaseBuffer();
			delete pCpd->lpData;
			delete pCpd;







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值