• 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)指 的长度。

    接收程序:

         接收程序先给窗口(我这里的窗口名叫“卡口图片管理”)添加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 
    ", str.c_str()) ;
    
        if (str == "0DAE12A3D8C9425DAAE25B3ECD16115A")
        {
            printf("正确接收 
    ") ;
        }
    
        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 
    ",pNotify->GUID) ;
    
        return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
    }

    运行结果:

    image

  • 相关阅读:
    ElasticSearch Java API
    ElasticSearch 核心概念
    ElasticSearch 基本操作
    ElasticSearch概述
    Spring AOP 实现原理与 CGLIB 应用
    Spring AOP 实现原理
    线程池队列饱和策略
    Hibernate 事物隔离级别 深入探究
    Hibernate 所有缓存机制详解
    Java NIO API详解
  • 原文地址:https://www.cnblogs.com/betterwgo/p/8441452.html
Copyright © 2020-2023  润新知