进程之间通讯的手法:
- WM_COPYDATA
- 共享DLL
- 内存映射
- socket
- 管道
- 邮件槽
1 WM_COPYDATA
有两份数据拷贝:第一次发送到操作系统高2GB共享区,然后再拷贝到目标进程的地址空间,适用于数据量不大的场合
//COPYDATASTRUCT原型
typedef struct tagCOPYDATASTRUCT {
ULONG_PTR dwData; // 数据类型,接受方可将其作为判别依据
DWORD cbData; // lpData指向的数据块的大小,即发送数据大小
PVOID lpData; // 数据块首地址
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
//API原型
SendMessage(
(HWND) hWnd, // handle to destination window
WM_COPYDATA, // message to send
(WPARAM) wParam, // handle to window (发送方的窗口句柄)
(LPARAM) lParam // data (PCOPYDATASTRUCT)(结构体指针)
);
示例:
//进程1.cpp
HWND hWnd = ::FindWindow(NULL, "接收方窗口名");
//1.定义要发送的数据
char szBuf[64] = "Hello Feature!";
//2.定义结构体参数
COPYDATASTRUCT cpd;
cpd.dwData = WM_USER+123;
cpd.cbData = 64;
cpd.lpData = szBuf;
//3.向目标窗口发送消息
::SendMessage( hWnd,
WM_COPYDATA,
(WPARAM)this->GetSafeHwnd(),
(LPARAM)&cpd);
//进程2.cpp
//4.剩下的由接收方负责写WM_COPYDATA的消息响应函数,pCopyDataStruct->dwData参数可以作为一种判断依据;
OnCopyData(CWnd*