进程间通信的方式有很多种,其底层原理使用的都是内存映射文件。

本文实现了Windows核心编程第五版475页上的demo,即使用内存映射文件来在进程间通信。

进程1

按钮【Create  mapping of Data】用来创建命名内存映射文件,后备存储器为页交换文件,而非磁盘上的文件,大小为4K,将全部大小映射到进程地址空间,将Data中的数据写入该内存映射文件,然后撤销对文件视图的映射。注意在进程1里不能CloseHandle(m_hFileMapping)

进程2

按钮【Open maping and get Data】用来打开进程1创建的命名内存映射文件,将全部大小映射到进程地址空间,从中读出数据,将数据内容放到Data里。

按钮【Close mapping of Data】用来关闭CloseHandle进程1返回的内存映射文件m_hFileMapping。

 void CMemoryMappingDlg::OnBnClickedBtnCreate2()
{
// TODO: 在此添加控件通知处理程序代码;
LPCTSTR lpFileMappingName = _T("MMFSharedData");
m_hFileMapping = CreateFileMapping(
INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, , * , lpFileMappingName);
DWORD dwErr = GetLastError(); if (NULL == m_hFileMapping )
{
AfxMessageBox(_T("无法创建该内存映射文件"));
return;
}
if (dwErr == ERROR_ALREADY_EXISTS)
{
AfxMessageBox(_T("存在同名内存映射文件"));
CloseHandle(m_hFileMapping);
return;
} PVOID pMapOfView = MapViewOfFile(m_hFileMapping, FILE_MAP_READ | FILE_MAP_WRITE, , , /*4 * 1024*/);
if (NULL == pMapOfView)
{
AfxMessageBox(_T("映射该文件错误"));
CloseHandle(m_hFileMapping);
return;
} ZeroMemory(pMapOfView, * ); CString strText;
GetDlgItemText(IDC_EDIT_DATA, strText);
memcpy_s(pMapOfView, (strText.GetLength() + ) * sizeof(TCHAR), strText.GetBuffer(),
(strText.GetLength() + ) * sizeof(TCHAR)); UnmapViewOfFile(pMapOfView);
//CloseHandle(m_hFileMapping); 不能执行此句,否则进程2不能打开该命名内存映射文件。
} void CMemoryMappingDlg::OnBnClickedBtnClose()
{
// TODO: 在此添加控件通知处理程序代码;
CloseHandle(m_hFileMapping);
} void CMemoryMappingDlg::OnBnClickedBtnOpen()
{
// TODO: 在此添加控件通知处理程序代码
LPCTSTR lpFileMappingName = _T("MMFSharedData"); //OpenFileMapping的第一个参数一定不能是PAGE_**, 区别于CreateFileMapping函数
//HANDLE hFileMapping = OpenFileMapping(PAGE_READWRITE, FALSE, lpFileMappingName);
HANDLE hFileMapping = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, lpFileMappingName); if (NULL == hFileMapping)
{
AfxMessageBox(_T("打不开该内存映射文件"));
return;
} PVOID pMapOfFile = MapViewOfFile(hFileMapping, FILE_MAP_READ | FILE_MAP_WRITE, , , /*4 * 1024 */);
if (NULL == pMapOfFile)
{
AfxMessageBox(_T("映射该文件错误"));
CloseHandle(hFileMapping);
return;
} TCHAR tchArr[];
ZeroMemory(tchArr, sizeof(tchArr));
memcpy_s(tchArr, sizeof(tchArr), pMapOfFile, sizeof(tchArr));
SetDlgItemText(IDC_EDIT_DATA, tchArr); UnmapViewOfFile(pMapOfFile);
CloseHandle(hFileMapping);
}

需要注意的地方是:

0、后备存储器为页交换文件的内存映射文件,CreateFileMapping的文件句柄参数为INVALID_HANDLE_VALUE

1、进程1创建了命名内存映射文件后,一定不能CloseHandle(内存映射文件句柄),否则进程2不能OpenFileMapping打开该命名内存映射文件

2、OpenFileMapping的第一个参数一定不能是PAGE_**, 区别于CreateFileMapping函数

【Windows核心编程】一个使用内存映射文件进行进程间通信的例子的更多相关文章

  1. Java编程思想:内存映射文件

    import java.io.*; import java.nio.IntBuffer; import java.nio.MappedByteBuffer; import java.nio.chann ...

  2. 《windows核心编程系列》十八谈谈windows钩子

    windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...

  3. 《windows核心编程系列》十六谈谈内存映射文件

    内存映射文件允许开发人员预订一块地址空间并为该区域调拨物理存储器,与虚拟内存不同的是,内存映射文件的物理存储器来自磁盘中的文件,而非系统的页交换文件.将文件映射到内存中后,我们就可以在内存中操作他们了 ...

  4. Windows核心编程 第十七章 -内存映射文件(下)

    17.3 使用内存映射文件 若要使用内存映射文件,必须执行下列操作步骤: 1) 创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件. 2) 创建一个文件映射内核对象,告诉系统该 ...

  5. Windows核心编程 第十七章 -内存映射文件(上)

    第1 7章 内存映射文件 对文件进行操作几乎是所有应用程序都必须进行的,并且这常常是人们争论的一个问题.应用程序究竟是应该打开文件,读取文件并关闭文件,还是打开文件,然后使用一种缓冲算法,从文件的各个 ...

  6. 《windows核心编程》 17章 内存映射文件

    内存映射文件主要用于以下三种情况: 系统使用内存映射文件载入并运行exe和dll,这大量节省了页交换文件的空间以及应用程序的启动时间 开发人员可以使用内存映射文件来访问磁盘上的数据文件.这使得我们可以 ...

  7. Java编程的逻辑 (61) - 内存映射文件及其应用 - 实现一个简单的消息队列

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  8. 文件映射(Windows核心编程)

    映射内存的可执行文件和dll 当一个线程调用CreateProcess的时候,系统会执行以下步骤: 系统会先确定CreateProcess所指定的可执行文件的所在位置.如果找不到文件,那么Create ...

  9. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

随机推荐

  1. AC日记——Flag Codeforces 16a

    A. Flag time limit per test 2 seconds memory limit per test 64 megabytes input standard input output ...

  2. AC日记——猴子 cogs 2043

    2043. 猴子 ★★   输入文件:monkeya.in   输出文件:monkeya.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 有n只猴子,第一只尾巴挂在树上 ...

  3. 牛客网 牛客小白月赛1 A.简单题-控制输出格式setiosflags()函数+setprecision()函数

    水一水博客,都不好意思写这篇博客,毕竟已经不是大一的了. 难得能把一整套题都写出来(日常智障).但是在这里不写G题あなたの蛙は旅⽴っています的题解. 有毒,G题关了流同步只能过94%的样例,说我运行超 ...

  4. iOS -- SKEmitterNode类

      SKEmitterNode类 继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObje ...

  5. mac 安装scrapy

    https://jingyan.baidu.com/article/14bd256e748346bb6d2612be.html 1.安装Python 安装完了记得配置环境,将python目录和pyth ...

  6. python为不同的对象如何分配内存的小知识

    id方法的返回值就是对象的内存地址. python中会为每个出现的对象分配内存,哪怕他们的值完全相等(注意是相等不是相同).如执行a=2.0,b=2.0这两个语句时会先后为2.0这个Float类型对象 ...

  7. C#使用反射机制获取类信息[转]

    http://www.cnblogs.com/zhoufoxcn/archive/2006/10/31/2515873.html 1.用反射动态创建类实例,并调用其公有成员函数. //新建一个类库项目 ...

  8. 近期微信上非常火的小游戏【壹秒】android版——开发分享

    近期在朋友圈,朋友转了一个html小游戏[壹秒],游戏的规则是:用户按住button然后释放,看谁能精准地保持一秒的时间.^_^刚好刚才在linuxserver上调试程序的时候server挂了,腾出点 ...

  9. 小谈Vim打开文件开头的&lt;feff&gt;

    在本地Windows机上开发的PHP程序上传到linuxserver上后,通过浏览器訪问对应接口.发现返回的数据前多了一个莫名的字符'-',甚为不解.之后通过网络抓包的方式,查看到接口返回数据前多了 ...

  10. xml实现AOP

    1.使用<aop:config></aop:config> 2.首先我们需要配置<aop:aspect></aop:aspect>,就是配置切面 2.1 ...