网传了很多关于MFC的进程间通信的方法,本人也进行了模仿和学习,有一点心得:
在发送消息的进程中需要将数据结构打包传递时如下设置:
void Cos_160112Dlg::OnBnClickedOsdlgSendmsgBtn()
{
// TODO: 在此添加控件通知处理程序代码
GetDlgItem(IDC_OSDLG_SENDMSG_EDIT)->GetWindowText(strContent);
if (strContent != _T(""))
{
UpdateData();
CWnd *pWnd = FindWindow(NULL, _T("os_recv_160112"));
//第二参数为接受消息窗口名,可以在接受窗口初始化时设置SetWindowText(_T("os_recv_160112"));
if (pWnd)
{
COPYDATASTRUCT cpd;
cpd.dwData = 0;
cpd.cbData = 2 * strContent.GetLength() + 1;//此处是重点,必须是长度的两倍+1,否则接受端数据接收不全,已测试
cpd.lpData = (void*)strContent.GetBuffer(cpd.cbData);
pWnd->SendMessage(WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)&cpd);
strContent.ReleaseBuffer();
}
}
}
接收端程序和网上的方式一样,首先添加WM_COPYDATA消息响应函数
在函数体中添加如下代码
BOOL Cos_recv_160112Dlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CString strRecvData = _T("");
strRecvData = (LPWSTR)pCopyDataStruct->lpData;
strRecvData = strRecvData.Left(pCopyDataStruct->cbData);
GetDlgItem(IDC_OSDLG_RECV_EDIT)->SetWindowText(strRecvData);
UpdateData(FALSE);
return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}
附件添加两个测试程序(vs2013) os_160112.exe(发送端),os_recv_160112.exe(接收端),自己做个笔记!