zoukankan      html  css  js  c++  java
  • 进程间通信——使用WM_COPYDATA消息通信

    使用SendMessage向另一进程发送WM_COPYDATA消息


    发送WM_COPYDATA消息

    SendMessage(接收窗口句柄, WM_COPYDATA, (WPARAM)发送窗口句柄, (LPARAM)&copyData);

    copyData是要发送的数据,类型为COPYDATASTRUCT结构体


    typedef struct tagCOPYDATASTRUCT {
        ULONG_PTR dwData;          //用户定义数据
        DWORD cbData;                  //用户定义数据的长度
        PVOID lpData;                      //指向用户定义数据的指针
    } COPYDATASTRUCT, *PCOPYDATASTRUCT;


    WM_COPYDATA消息只可以使用SendMessage函数(同步)发送,不可以使用PostMessage(异步)发送。

    COPYDATA结构体的实质依然是共享内存,区别是这一片特殊的共享内存由操作系统管理而不用用户手动申请管理。

    WM_COPYDATA适合小数据量的进程间通信,大数据量可能造成内存问题,以及界面卡死,因为消息的发送形式是同步的。


    发送端
    void CSendDlg::OnDataSend()

    {

    CWnd *pWnd = CWnd::FindWindow(NULL,"接收窗口的标题");

    CString sCopyData = "HELLO";

    COPYDATASTRUCT cpd;

    cpd.dwData = 0;

    cpd.cbData = sCopyData.GetLength() + 1;//多加一个长度,防止乱码

    cpd.lpData = (void*)sCopyData.GetBuffer(cpd.cbData);

    pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);

    }


    接收端

    声明afx_msg void OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
    添加消息映射BEGIN_MESSAGE_MAP(CMainFrame, CCJMDIFrameWnd)

    ...
    ...
    ON_MESSAGE(WM_COPYDATA, OnCopyData)
    ...
    ...
    END_MESSAGE_MAP()


    BOOL CReceiveDlg::OnCopyData( CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct )

    {

    AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData));

    }



    版权声明:

  • 相关阅读:
    requestAnimationFrame
    react 面试题
    useState使用和原理
    常用网址记录
    .net 学习官网
    centos nginx 设置开启启动
    Asp.Net Core 发布和部署 Linux + Nginx
    SQL Server 执行计划缓存
    SQL Server之索引解析(二)
    SQL Server之索引解析(一)
  • 原文地址:https://www.cnblogs.com/walccott/p/4956928.html
Copyright © 2011-2022 走看看