进程通信

  • 使用 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;
      }

      }
05-11 22:28