进程通信
使用 WM_COPYDATA
客户端(发送端)
// 1. 找到窗口程序
HWND hWnd = FindWindow(NULL, L"Window1");
// 2. 构建一个 COPYDATASTRUCT 结构体
COPYDATASTRUCT CopyData = { };
CopyData.dwData = 0x100; // 要传递的一个4字节数据,通常是类型
CopyData.cbData = 0x0A; // 存储数据的缓冲区大小
CopyData.lpData = (LPVOID)"Hello15pb"; // 指向要发送的数据
// 3. 发送数据给对象的窗口
SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&CopyData);服务端(接收端)
// 响应 WM_COPYDATA 消息
case WM_COPYDATA:
{
// 1. 获取 LPARAM 只想的内容
auto CopyData = (PCOPYDATASTRUCT)lParam;
// 2. 输出内容
MessageBoxA(hWnd, (LPCSTR)CopyData->lpData, "WM_COPYDATA", MB_OK);
break;
}
使用 邮槽内核对象
客户端(发送端)
// 1. 打开邮槽对象
HANDLE hFile = CreateFile(
L"\\\\.\\mailslot\\Sample", // 邮槽名称
GENERIC_WRITE, // 读写属性
FILE_SHARE_READ, // 共享属性
NULL, // 安全属性
OPEN_EXISTING, // 打开方式
FILE_ATTRIBUTE_NORMAL, // 标志位
NULL); // 文件模板(默认留空)
// 2. 向mailslot写入
DWORD dwWritten = ;
WriteFile(hFile, "Hello", , &dwWritten, NULL);
// 3. 结束
printf("已经向邮槽写入信息!\n");
CloseHandle(hFile);服务端(接收端)
// 1. 创建邮槽对象
HANDLE hSlot = CreateMailslot(
L"\\\\.\\mailslot\\Sample", // 邮槽名
, // 不限制消息大小
MAILSLOT_WAIT_FOREVER, // 无超时
NULL); // 安全属性
// 2. 循环读取邮槽信息
while (true)
{
// 2.1 获取邮槽消息数量
DWORD dwMsgCount = , dwMsgSize = ;
// 2.2 获取邮槽信息
GetMailslotInfo(
hSlot, // 邮槽句柄
NULL, // 无最大消息限制
&dwMsgSize, // [ 下一条消息的大小 ]
&dwMsgCount, // [ 消息的总数量 ]
NULL); // 无时限
// 2.3 如果没有接收到消息,那么久休眠一阵子
if (dwMsgSize == MAILSLOT_NO_MESSAGE)
{
Sleep();
continue;
}
// 2.4 循环获取全部消息(有可能不只一条)
while (dwMsgCount)
{
DWORD dwRet = ;
PBYTE lpBuffer = new BYTE[dwMsgSize]{ };
// 2.5 读取邮槽中的信息
if (!ReadFile(hSlot, lpBuffer, dwMsgSize, &dwRet, NULL))
{
printf("ReadFile函数执行失败,错误码:%d.\n", GetLastError());
delete[] lpBuffer;
return ;
}
printf("邮槽的内容: %s\n", lpBuffer);
// 2.6 计算剩余的消息数
GetMailslotInfo(hSlot, (LPDWORD)NULL, &dwMsgSize, &dwMsgCount, nullptr);
delete[] lpBuffer;
}
}