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适用于携带量小,发送不频繁情况。