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中利用共享内存来实现不同进程间的通信的更多相关文章

  1. 学习笔记:Linux下共享内存的方式实现进程间的相互通信

    一.常用函数 函数系列头文件 #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> ft ...

  2. [转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile

    http://blog.csdn.net/stpeace/article/details/39534361 进程间的通信方式有很多种, 上次我们说了最傻瓜的“共享外存/文件”的方法. 那么, 在本文中 ...

  3. php中对共享内存,消息队列的操作

    http://www.cnblogs.com/fengwei/archive/2012/09/12/2682646.html php作为脚本程序,通常生命周期都很短,如在web应用中,一次请求就是ph ...

  4. Akka系列(四):Akka中的共享内存模型

    前言...... 通过前几篇的学习,相信大家对Akka应该有所了解了,都说解决并发哪家强,JVM上面找Akka,那么Akka到底在解决并发问题上帮我们做了什么呢? 共享内存 众所周知,在处理并发问题上 ...

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

    一.共享内存介绍 共享内存是三个IPC(Inter-Process Communication)机制中的一个. 它允许两个不相关的进程访问同一个逻辑内存. 共享内存是在两个正在进行的进程之间传递数据的 ...

  6. ython实现进程间的通信有Queue,Pipe,Value+Array等,其中Queue实现多个进程间的通信,而Pipe实现两个进程间通信,而Value+Array使用得是共享内存映射文件的方式,所以速度比较快

    1.Queue的使用 from multiprocessing import Queue,Process import os,time,random #添加数据函数 def proc_write(qu ...

  7. Windows进程间的通信

    一.进程与进程通信   进程间通信(Interprocess Communication, IPC)是指不同的进程之间进行数据共享和数据交换. 二.进程间通信方式 1.  文件映射 注:文件映射是在多 ...

  8. c++ 网络编程(三) LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613027.html 锲子:进程与线程是什么,他们的区别在哪里: 1 进程概念 进程是程序的一 ...

  9. Unix系统中,两个进程间的通信

    进程之间通常需要进行数据的传输或者共享资源等,因此进程间需要通讯. 可以通过管道,信号,消息队列,共享内存,信号量和套接字等方式 FIFO表示命名管道,这种管道的操作是基于先进先出原理. PIPE 表 ...

随机推荐

  1. 牛客小白月赛 G 异或 找规律

    链接:https://www.nowcoder.com/acm/contest/135/G来源:牛客网 题目描述 从前,Apojacsleam家的水族箱里,养了一群热带鱼. 在这几条热带鱼里,Apoj ...

  2. ☆1003 Dijstra

    循环N次 算法分为两部分: 1)找到距离最小的城市,找不到距离更小的城市时退出方法 2)更新距离 实际操作时,先初始化: 更新dis为INF,更新dis[start] = 0: 变种: 找最短路径的条 ...

  3. 在React中使用Bootstrap

    这几天想在react中用一下bootstrap,尽管有一个适配react的很好的库叫react-bootstrap,但我还是想直接使用bootstrap 可以在react项目中执行以下命令安装boot ...

  4. 分析spring4和spring5日志中的不同

    日志在工作中起到关键作用,我们经常使用它来打印关键信息,方便分析,或者是输出错误信息,用于bug排查,spring中同样使用了日志进行信息的输出,但是spring4和spring5之间的日志又有些不同 ...

  5. PHP的调试环境程序集成包----phpStudy

    PHP (超文本预处理器) PHP即“超文本预处理器”,是一种通用开源脚本语言.PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言.PHP独特的语法混合了C.Java.Perl以及 ...

  6. Python(Head First)学习笔记:六

    6 定制数据对象:数据结构自定义 打包代码与数据 james2.txt: James Lee,2002-3-14,2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-2 ...

  7. 联想thinkpad如何关闭触摸板

    Tinkpad系列很多关闭触摸屏的功能的方法都是没有的!!!比如说1.Fn+F6,或者Fn+某个按键...直接关闭没用比如说2.控制面板,鼠标/键盘,找到触摸开关...间接关闭没用比如说3.我的电脑, ...

  8. Nuget打包类库及引用

    什么是nuget 适用于任何现代开发平台的基本工具可充当一种机制,通过这种机制,开发人员可以创建.共享和使用有用的代码. 通常,此类代码捆绑到"包"中,其中包含编译的代码(如 DL ...

  9. DDD领域驱动实践记录

    虽然很早之前就已经了解过DDD相关的内容了,但一方面网上理论知识太过碎片化导致难以理解,另一方面实践内容太少导致想动手的时候无从下手.于是就渐渐淡忘了这方面实践的念头. 最近重新了解了DDD相关的知识 ...

  10. Django中自定义模型管理器(Manager)及方法

    1.自定义管理器(Manager) 在语句Book.objects.all()中,objects是一个特殊的属性,通过它来查询数据库,它就是模型的一个Manager.每个Django模型至少有一个ma ...