Windows提高_1.4进程通信

进程通信

  • 使用 WM_COPYDATA

    • 客户端(发送端)

      // 1. 找到窗口程序
      HWND hWnd = FindWindow(NULL, L"Window1");
      ​
      // 2. 构建一个 COPYDATASTRUCT 结构体
      COPYDATASTRUCT CopyData = { 0 };
      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 = 0;
      WriteFile(hFile, "Hello", 6, &dwWritten, NULL);
      ​
      // 3. 结束
      printf("已经向邮槽写入信息!
      ");
      CloseHandle(hFile);
    • 服务端(接收端)

      // 1. 创建邮槽对象
      HANDLE hSlot = CreateMailslot(
          L"\\.\mailslot\Sample",     // 邮槽名
          0,                              // 不限制消息大小 
          MAILSLOT_WAIT_FOREVER,          // 无超时 
          NULL);                          // 安全属性
      // 2. 循环读取邮槽信息
      while (true) 
      {
          // 2.1 获取邮槽消息数量
          DWORD dwMsgCount = 0, dwMsgSize = 0;
      ​
          // 2.2 获取邮槽信息
          GetMailslotInfo(
              hSlot,                  // 邮槽句柄 
              NULL,                   // 无最大消息限制
              &dwMsgSize,             // [ 下一条消息的大小 ]
              &dwMsgCount,            // [ 消息的总数量 ]
              NULL);                  // 无时限
      // 2.3 如果没有接收到消息,那么久休眠一阵子
          if (dwMsgSize == MAILSLOT_NO_MESSAGE) 
          {
              Sleep(2000);
              continue;
          }
      ​
          // 2.4 循环获取全部消息(有可能不只一条)
          while (dwMsgCount)
          {
              DWORD dwRet = 0;
              PBYTE lpBuffer = new BYTE[dwMsgSize]{ 0 };
      ​
              // 2.5 读取邮槽中的信息
              if (!ReadFile(hSlot, lpBuffer, dwMsgSize, &dwRet, NULL))
              {
                  printf("ReadFile函数执行失败,错误码:%d.
      ", GetLastError());
                  delete[] lpBuffer;
                  return 0;
              }
              printf("邮槽的内容: %s
      ", lpBuffer);
      ​
              // 2.6 计算剩余的消息数
              GetMailslotInfo(hSlot, (LPDWORD)NULL, &dwMsgSize, &dwMsgCount, nullptr);
              delete[] lpBuffer;
          }
      ​
      }
    •  

原文地址:https://www.cnblogs.com/ltyandy/p/10932778.html