消息作用: 在进程间共享数据(内部通过创建内存映射文件) 消息介绍: 需要用到的数据结构/类型: 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