进程通信

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

      }

Windows提高_1.4进程通信的更多相关文章

  1. Windows提高_1.2遍历进程、遍历模块

    进程 什么是进程? 通俗的来讲,进程就是一个运行中的程序,最少包含一个虚拟空间,通常是 4 GB大小,一组提供数据和代码的模块,通产是 dll 和 exe 文件,一个进程内核对象和最少一个线程. 进程 ...

  2. Windows提高_1.3文件操作

    文件操作 不带句柄的文件操作 // 1. 拷贝文件,第三个参数为 FALSE 表示会覆盖 // CopyFile(L"D:\\1.txt", L"E:\\2.txt&qu ...

  3. Windows提高_1.1内核对象

    内核对象 什么是内核对象? 内核对象本质上是一个结构体,我们不能直接的操作一个内核对象,需要通过操作系统提供的一系列函数和我们使用的内核对象句柄对它进行一系列的修改. 如何操作内核对象? 创建一个内核 ...

  4. 进程以及进程通信(IPC)类型

    这里用我有限的知识来解释同时参考了一些其他博主的子类,希望能给与一部分入门的朋友一个清晰的理解,有问题之处还请指出 首先简单谈一下什么是进程? 答:进程是装入内存运行的程序段,是许多的系统对象拥有权的 ...

  5. Windows线程+进程通信

    一 Windows线程进程 1)定义 按照MS的定义, Windows中的进程简单地说就是一个内存中的可执行程序, 提供程序运行的各种资源. 进程拥有虚拟的地址空间, 可执行代码, 数据, 对象句柄集 ...

  6. Windows进程通信 -- 共享内存(1)

    共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 W ...

  7. Windows进程通信 -- 共享内存

    享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 Wi ...

  8. Windows进程通信之一看就懂的匿名管道通信

    目录 进程通信之一看就懂的匿名管道通信 一丶匿名管道 1.1何为匿名管道 1.2创建匿名管道需要注意的事项 1.3 创建匿名管道需要的步骤 1.4代码例子 1.5代码运行截图 进程通信之一看就懂的匿名 ...

  9. Windows进程通信-共享内存空间

    三个模块 1,game.exe,三个方法,控制台输入指令('A','B','R')分别控制三个方法的调用: 2,WGDll.dll,要注入到game进程中的dll文件: 3,myconsole.exe ...

随机推荐

  1. uva 10765 Doves and Bombs(割顶)

     题意:给定一个n个点的连通的无向图,一个点的"鸽子值"定义为将它从图中删去后连通块的个数.求每一个点的"鸽子值". 思路dfs检查每一个点是否为割顶,并标 ...

  2. sublime text3编辑器经常使用快捷方式

    1.简单语法的自己主动补全 preferences->setting user 输入例如以下代码,保存. { "auto_complete":true, "auto ...

  3. 脱离开发软件启动Tomcat访问项目

    作为开发人员平时用的最多的就是通过开发软件启动Tomcat服务,从而访问项目.这样便于开发的bug调试 此处讲的是脱离开发软件启动Tomcat访问项目 链接参考: http://jingyan.bai ...

  4. 利用JFreeChart生成时序图(6) (转自 JSP开发技术大全)

    利用JFreeChart生成时序图(6) (转自 JSP开发技术大全) 14.6 利用JFreeChart生成时序图 通过JFreeChart插件只能生成普通效果的时序图,利用工厂类ChartFact ...

  5. redis.exceptions.ConnectionError: Error 10061 connecting to 127.0.0.1:6379. 由于目标计算机积极拒绝,无法连接

    redis.exceptions.ConnectionError: Error 10061 connecting to 127.0.0.1:6379. 由于目标计算机积极拒绝,无法连接   是由于没有 ...

  6. ModuleNotFoundError: No module named 'cStringIO'

    这是2.x转3.x问题: 2.x写法: import cStringIO 3.x写法: from io import StringIO 问题解决.

  7. ModuleNotFoundError: No module named 'urlparse'

    这是2.x转3.x问题 2.x写法: from urlparse import urlparse   3.x写法: from urllib.parse import urlparse 问题解决.

  8. C#面向过程之冒泡排序

    //定义一个数组,准备冒泡排序 ,,-,,,,-,}; //定义一个中间变量 ; //n个数字比较需要进行n-1次比较 ; j < arr.Length - - i; j++) { //每一趟的 ...

  9. 几个SQL小知识(转)

    原文地址:http://www.cnblogs.com/wuguanglei/p/4205976.html 写在前面的话:之前做的一个项目,数据库及系统整体构架设计完成之后,和弟兄们经过一段时间的编码 ...

  10. 07-11 Linux命令操作

    1. 查看当做操作目录位置    > pwd 2. 查看(当前)目录里边的文件内容    > ls                //list    > ls  -l  或ll    ...