MFC sendmessage实现进程间通信

时间:2022-08-28 20:52:52

用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);}


运行结果:

MFC sendmessage实现进程间通信


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);}

运行结果:

MFC sendmessage实现进程间通信