• 使用 WM_COPYDATA 在进程间共享数据


    消息作用:
        在进程间共享数据(内部通过创建内存映射文件)
    
    消息介绍:
    需要用到的数据结构/类型:
    typedef struct tagCOPYDATASTRUCT {
        ULONG_PTR dwData;
        DWORD cbData;
        PVOID lpData;
    } COPYDATASTRUCT, *PCOPYDATASTRUCT;
    
    结构体参数说明:
        dwData(ULONG)   保存一个数值, 可以用来作标志等
        lpData(void*)   待发送的数据的起始地址(可以为NULL)
        cbData(DWORD)   待发送的数据的长度
        
    消息的参数:
        hWnd:   接收数据的窗口的句柄
        wParam: 传送该数据的窗口句柄(NULL也无所谓)
        lParam: COPYDATASTRUCT类型变量的地址
        
    使用示例:
        COPYDATASTRUCT cds;
        char msg[] = "女孩不哭";
        cds.dwData = 0;
        cds.lpData = msg;
        cds.cbData = strlen(msg)+1; //字符串请记得把'\0'加上, 不然就错了, 这里是ANSI字符串
        SendMessage(FindWindow("nbsg_class", NULL), WM_COPYDATA, 0, (LPARAM)&cds);
        
    接收端对该消息的一种可能处理:
        case WM_COPYDATA:
        {
            //这里的消息应该是以 '\0' 结尾的字符串
            COPYDATASTRUCT* pCDS = (COPYDATASTRUCT*)lParam;
            MessageBox(hWnd, pCDS->lpData, "", MB_OK);
            return TRUE;
        }
        
    说明:  
        发送的数据可以是任意的, 我上面只是为了用MessageBox做测试, 所以发送的是以'\0'的字符串.
        如果接收消息的应用程序处理了该消息, 它应该返回 TRUE , 否则返回 FALSE. lpData 指向的内存应该是一段"数据", 就是说里面不应该有指向该程序某数据的指针. 因为 SendMessage 在处理 WM_COPYDATA 时, 只是把 lpData 指向的 cbData 个字节复制到共享内存中. 当前进程私有的指针就算是被发送到接收程序, 其也是无法访问的. 当该消息正当发送时, 该进程的其它线程不能修改其中的数据. 接收端应用程序应该把这段共享内存作为只读内存来访问. 请不要尝试修改其中的内容. lParam 指向的数据只有在该消息处理时有效, 消息返回后无效(共享内存已被释放). 且接收端也不能释放该内存. 如果要在消息返回后继续取得数据, 可以把它复制到当前进程的某个位置.

    女孩不哭(QQ:191035066) @ 2012-09-11 23:25:31 @ http://www.cnblogs.com/nbsofer

  • 相关阅读:
    duilib入门简明教程 -- VS环境配置(2) Alberl
    使用libCurl实现断点下载
    通用选择器和高级选择器
    Aforge.net 一个专门为开发者和研究者基于C#框架设计
    iBatis核心框架浅析
    Parameter Binding in ASP.NET Web API(参数绑定)
    图的基本概念
    领域模型中分散的事务如何集中统一处理(C#解决方案)
    .NET 垃圾回收与内存泄漏
    三层架构之泛型抽象工厂
  • 原文地址:https://www.cnblogs.com/memset/p/2680980.html
Copyright © 2020-2023  润新知