• 使用 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

  • 相关阅读:
    OutOfMemoryError异常穷举
    Java的锁优化
    Java的线程安全
    Java的线程模型
    算法笔记_014:合并排序(Java)
    算法笔记_013:汉诺塔问题(Java递归法和非递归法)
    算法笔记_012:埃拉托色尼筛选法(Java)
    算法笔记_011:希尔排序
    算法笔记_010:插入排序(Java)
    算法笔记_009:字符串匹配(Java)
  • 原文地址:https://www.cnblogs.com/memset/p/2680980.html
Copyright © 2020-2023  润新知