zoukankan      html  css  js  c++  java
  • Windows中利用共享内存来实现不同进程间的通信

    Windows中利用共享内存来实现不同进程间的通信

    一、msdn详细介绍

    https://docs.microsoft.com/zh-cn/windows/win32/memory/sharing-files-and-memory

     

    二、实现思路讲解:

      在A进程,我们通过 CreateFileMapping()函数来创建一个文件映射对象(使用 INVAILD_HANDLE_VALUE 来不指定文件句柄),然后调用MapFileOfView()函数来将文件映射对象映射到本进程中,利用copymemory来进行内存读写。

      在B进程,我们通过 OpenFileMapping()来打开,然后调用MapFileOfView()函数来将文件映射对象映射到本进程中,利用copymemory来进行内存读写。

     

    三、应用场景:

      两进程间的数据交换,比如,我们将游戏外挂代码注入到Game.exe进程中,我们另起一个外挂控制台.exe来控制外挂,此时我们就可以使用共享内存,Game.exe开辟一线程,循环读取该内存数据并标记,而console.exe则负责将用户的指令传入到内存中,这样就实现交互了。

     

    四、注意事项:

    1. 参数一定要细心别写错了。
    2. 如果实现两进程之间的交流问题,比如 A <--> B相互发消息,建议开辟两块内存,一块 A-->B,另一块 B-->A,否则可能被占用或修改(起码至少要用锁来同步)。在其余通信开发时这个问题也应该注意到。

    五、源代码:

      参考下面博客,注意其在B进程也调用CreateFileMapping()来创建一个已经存在的内核对象,此时,其会返回该内核对象(并不会出错,同时GetLastError()函数返回ERROR_ALREADY_EXISTS值。

      https://blog.csdn.net/stpeace/article/details/39534361

     

  • 相关阅读:
    bzoj 3531 [Sdoi2014]旅行(树链剖分,线段树)
    bzoj 2243 [SDOI2011]染色(树链剖分,线段树)
    spoj 375 Query on a tree(树链剖分,线段树)
    bzoj 2618 2618: [Cqoi2006]凸多边形(半平面交)
    C++中int型与char型相互转换的问题
    408 二进制求和
    407 加一
    斐波那契数列几种算法及时间复杂度分析
    397 Longest Continuous Increasing Subsequence
    376 二叉树的路径和
  • 原文地址:https://www.cnblogs.com/onetrainee/p/11667416.html
Copyright © 2011-2022 走看看