MFC sendmessage实现进程间通信

Posted 啊基米舍的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC sendmessage实现进程间通信相关的知识,希望对你有一定的参考价值。

用sendmessage实现进程间通信。


1.WM_COPYDATA实现进程间通信

实现方式是发送WM_COPYDATA消息。

发送程序:

LRESULT copyDataResult;  //copyDataResult has value returned by other app 
CWnd *pOtherWnd = CWnd::FindWindow(NULL, "卡口图片管理");

CString strDataToSend = "0DAE12A3D8C9425DAAE25B3ECD16115A" ;
if (pOtherWnd)
{
    COPYDATASTRUCT cpd;
    cpd.dwData = 0;
    cpd.cbData = strDataToSend.GetLength()+sizeof(wchar_t);             //data length
    cpd.lpData = (void*)strDataToSend.GetBuffer(cpd.cbData); //data buffer
    copyDataResult = pOtherWnd->SendMessage(WM_COPYDATA,(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),(LPARAM)&cpd);
    strDataToSend.ReleaseBuffer();
}
else 
{
    AfxMessageBox("Unable to find other app.");
}

这里字符串长度为strDataToSend.GetLength()+sizeof(wchar_t),其中sizeof(wchar_t)指 \\0 的长度。

接收程序:

     接收程序先给窗口(我这里的窗口名叫“卡口图片管理”)添加WM_COPYDATA消息函数,然后在函数中添加成如下:

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

    CString strRecievedText = (LPCSTR) (pCopyDataStruct->lpData);
    string str(strRecievedText.GetBuffer(pCopyDataStruct->cbData));
    //string str = strRecievedText.GetBuffer() ;
    printf("%s \\n", str.c_str()) ;

    if (str == "0DAE12A3D8C9425DAAE25B3ECD16115A")
    {
        printf("正确接收 \\n") ;
    }

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


运行结果:

image


2.win32程序和x64程序之间传递结构体

win32程序和x64程序的指针长度是不一样的。经大神指点,结构体中的成员变量只能是基本数据类型,不能是像string这样的类,大体原因是类中有函数,函数也是一个地址(说法貌似不严谨,大概是这个意思)。

下面在之前的基础上实现传递结构体。

结构体定义:

struct NOTIFY_INFO_t
{
    char  GUID[1024];
    char  task_id[1024];
    int  index ;
};

收发程序中的结构体定义要一致(结构体名可以不一致,但内部需要一致)。

主要的注意点是结构体成员变量的定义,具体的收发其实差不多。

发送:

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

    LRESULT copyDataResult;  //copyDataResult has value returned by other app 
    CWnd *pOtherWnd = CWnd::FindWindow(NULL, "卡口图片管理");

    CString strDataToSend = "0DAE12A3D8C9425DAAE25B3ECD16115A" ;
     if (pOtherWnd)
    {
        NOTIFY_INFO_t *pNotify = new NOTIFY_INFO_t();
        memcpy(pNotify->GUID,"0DAE12A3D8C9425DAAE25B3ECD16115A",sizeof("0DAE12A3D8C9425DAAE25B3ECD16115A")) ;

        COPYDATASTRUCT cpd;
        cpd.dwData = 0;
        cpd.cbData = sizeof(NOTIFY_INFO_t);             //data length
        cpd.lpData = (void*)pNotify;                //data buffer
        copyDataResult = pOtherWnd->SendMessage(WM_COPYDATA,(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),(LPARAM)&cpd);
        strDataToSend.ReleaseBuffer();
    }
    else 
    {
        AfxMessageBox("Unable to find other app.");
    }
}

接收:

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

    NOTIFY_INFO_t *pNotify ;
    pNotify = (NOTIFY_INFO_t *)pCopyDataStruct->lpData ;

    printf("%s \\n",pNotify->GUID) ;

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

运行结果:

image

以上是关于MFC sendmessage实现进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信之WM_COPYDATA

VC进程间通信之消息传递PostMessge()或SendMessage()

C++编程,进程间通信的问题,sendMessage后另一个进程如何接收消息?

C#进程间通信--API传递参数(SendMessage)

利用WM_COPYDATA消息实现进程间通信

.Net 进程间通信