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

原文地址:https://www.cnblogs.com/memset/p/2680980.html