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

Posted onetrainee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于Windows中利用共享内存来实现不同进程间的通信的主要内容,如果未能解决你的问题,请参考以下文章

进程间的数据共享

linux进程间的通信之 共享内存

linux进程间的通信(C): 共享内存

Windows进程间共享内存通信实例

操作系统(os)

Linux进程间通信 共享内存+信号量+简单样例