加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

Windows提高_1.4进程通信

发布时间:2020-12-14 01:37:42 所属栏目:Windows 来源:网络整理
导读:进程通信 使用 WM_COPYDATA 客户端(发送端) // 1. 找到窗口程序 HWND hWnd = FindWindow(NULL,L " Window1 " );? // 2. 构建一个 COPYDATASTRUCT 结构体 COPYDATASTRUCT CopyData = { 0 };CopyData.dwData = 0x100 ; // 要传递的一个4字节数据,通常是类型 C

进程通信

  • 使用 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"\.mailslotSample",// 邮槽名称
          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("已经向邮槽写入信息!n");
      CloseHandle(hFile);

      ?

    • 服务端(接收端)

      // 1. 创建邮槽对象
      HANDLE hSlot = CreateMailslot(
          L"\.mailslotSample",// 邮槽名
          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.n",GetLastError());
                  delete[] lpBuffer;
                  return 0;
              }
              printf("邮槽的内容: %sn",lpBuffer);
      ?
              // 2.6 计算剩余的消息数
              GetMailslotInfo(hSlot,(LPDWORD)NULL,&dwMsgSize,&dwMsgCount,nullptr);
              delete[] lpBuffer;
          }
      ?
      }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读