zoukankan      html  css  js  c++  java
  • Windows核心编程——进程间通信之WM_COPYDATA

    1.进程间通信

      进程间通信(IPC,InterProcess Communicate)就是指在不同进程之间传播或交换信息。
      IPC的常见通信方式包括管道、消息队列、Socket、文件内存映射、dll共享段、WMCOPYDATA

    2.WM_COPYDATA

        一个程序通过WM_COPYDATA消息传递数据给另一个程序。

            该消息只能由 SendMessage() 发送 ,SendMessage()需要知道进程柄,所以一般都搭配FindWindow()使用。通过FindWindow查找进程句柄,然后使用SendMessage() 向这个句柄发送信息.

    API函数:

    typedef struct tagCOPYDATASTRUCT {
    DWORD dwData; DWORD cbData; PVOID lpData; } COPYDATASTRUCT;

    示例:从进程A和B之间用COPYDATA通信:
    1.创建对话框TESTCPD,添加发送按钮,添加事件:

    HWND hWnd = ::FindWindow(NULL, "Recv");
    
    COPYDATASTRUCT cds;
    cds.dwData = 0x87654093;
    char szBuff[] = { "hello !!!" };
    cds.lpData = szBuff;
    cds.cbData = sizeof(szBuff);
    
    //发送WM_COPUDATA
    ::SendMessage(hWnd, WM_COPYDATA, (WPARAM)GetSafeHwnd(),(LPARAM)&cds);
    

     2.再创建一个对话框REC用来接受消息,再对话框类向导->虚函数->添加消息WM_COPYDATA BOOL 

    BOOL CRECVCOPYDATADlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
    {
    	CString csFmt;
    	csFmt.Format("%08X %s", pCopyDataStruct->dwData, pCopyDataStruct->lpData);
    	AfxMessageBox(csFmt);
    
    	return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
    }DialogEx::OnCopyData(pWnd, pCopyDataStruct); }
    


    测试A可以发送B:

    测试A、B间发送的最大空间:

     

     空间非常大512M都可以发送。

    问题:copydata携带的数据被修改不会影响发送者?(携带的数据实际是只读的)

    目标进程能在自己的进程里直接读,是因为做了数据的拷贝。

        一块数据要通过COPUDATA 从A进程发送到B进程,先把A进程的一块数据拷贝至内核,再把数据从内核拷贝至B进程的用户区,所以修改B的数据不会对A有影响。


          如果携带的数据量大,还需多次拷贝,使用copydata效率会很低,所有WMCOPY DATA适用于携带量小,发送不频繁情况。




  • 相关阅读:
    The library contains native libr…
    DHCP configurations in Ubuntu
    如何编译Linux Kernel
    Rsync 使用指南
    Linux下用semaphore来做进程间互斥
    How to generate patch file?
    PS3MediaServer(用于PS3的DLNA server) 在Ubuntu 9.10上的安装和配置
    嘉猪的最爱 PS3
    梦寐以求的SPL总冠军,KT你赢了
    PLU space in 优酷
  • 原文地址:https://www.cnblogs.com/zhaoyixiang/p/12984975.html
Copyright © 2011-2022 走看看