首页 > 技术文章 > MFC使用WM_COPYDATA消息进行进程间的通讯

rcg714786690 2020-05-10 16:51 原文

一、介绍

Windows上MFC应用程序可使用WM_COPYDATA可以完成两个进程之间的通讯。
当一个应用向另一个应用传送数据时,发送方需调用SendMessage函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需响应WM_COPY DATA消息,双方就实现了数据共享。
它在底层实际上是通过文件映射来实现的,缺点是灵活性不高,并且它只能用于Windows平台的单机环境下。

二、发送端界面与代码示例

void CclientDlg::OnBnClickedButtonSend()
{
    // TODO: 在此添加控件通知处理程序代码

    CString strMsg;
    GetDlgItem(IDC_EDIT_SendData)->GetWindowText(strMsg);

    CWnd* serverWnd = CWnd::FindWindow(NULL, L"server");
    if (serverWnd)
    {
        COPYDATASTRUCT cpd;
        cpd.dwData = 0;//用户定义的数据类型,可以用来作为发送标志
        cpd.cbData = strMsg.GetLength() * sizeof(TCHAR);//数据大小,长度一定要满足,否则数据传输不全
        cpd.lpData = (void*)strMsg.GetBuffer(cpd.cbData); //数据指针
        LRESULT copyDataResult = ::SendMessage(serverWnd->GetSafeHwnd(), WM_COPYDATA, NULL, (LPARAM)&cpd);//发送消息
        strMsg.ReleaseBuffer();
    }
}

三、接收端界面与代码示例

在对话框界面,右键对话框->属性,选择消息选项卡,添加WM_COPYDATA消息,如下图

 消息函数代码如下:

BOOL CserverDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    LPCTSTR lstrMsg = (LPCTSTR)(pCopyDataStruct->lpData);
    CString strMsg(lstrMsg);
    GetDlgItem(IDC_EDIT_ReceiveData)->SetWindowText(strMsg);

    return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}

四、效果与代码下载

代码下载地址: https://download.csdn.net/download/rcg714786690/12406356

 

参考链接:

https://blog.csdn.net/tercel_zhang/article/details/49056037

https://www.cnblogs.com/betterwgo/p/8441452.html

推荐阅读