背景

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

函数 API

// 创建一个内存映射文件的内核对象HANDLE CreateFileMapping(HANDLE hFile,                                     // 文件句柄,填写 INVALID_HANDLE_VALUELPSECURITY_ATTRIBUTES lpFileMappingAttributes,    // 安全描述符,填写 NULL             DWORD flProtect,                                // 映射对象保护属性DWORD dwMaximumSizeHigh,                         // 文件映射的最大长度的高32位DWORD dwMaximumSizeLow,                            // 文件映射的最大长度的低32位LPCTSTR lpName                                     // 文件映射对象名称
);// 如果创建成功,返回创建的内存映射文件的句柄,如果已经存在,则也返回其句柄,但是调用 GetLastError()返回的错误码是:183(ERROR_ALREADY_EXISTS),如果创建失败,则返回NULL;
// 将内存映射文件映射到进程的虚拟地址中LPVOID MapViewOfFile(HANDLE hFileMappingObject,  // CreateFileMapping()返回的文件映像对象句柄DWORD dwDesiredAccess,      // 数据的访问方式DWORD dwFileOffsetHigh,     // 文件映射起始偏移的高32位DWORD dwFileOffsetLow,      // 文件映射起始偏移的低32位DWORD dwNumberOfBytesToMap  // 文件中要映射的字节数,为0表示映射整个文件映射对象
);// 如果函数成功,返回值是映射视图的起始地址。失败返回 NULL。
// 在接收进程中打开对应的内存映射对象HANDLE OpenFileMapping(DWORD dwDesiredAccess,  // 数据的访问方式BOOL bInheritHandle,    // 是否继承句柄LPCTSTR lpName          // 要打开的文件映射对象名称
);// 如果函数成功,返回值是指定文件映射对象的打开句柄。失败返回 NULL。

进行内存映射文件的读写

//读操作:
if ( m_pViewOfFile  )   // m_pViewOfFile 为映射视图的起始地址,当然也可以加上一定的偏移,取决于数据的位置。
{// read text from memory-mapped fileTCHAR s[dwMemoryFileSize];lstrcpy(s, (LPCTSTR) m_pViewOfFile);
}
//写操作:
if ( m_pViewOfFile ){TCHAR s[dwMemoryFileSize];m_edit_box.GetWindowText(s, dwMemoryFileSize);lstrcpy( (LPTSTR) m_pViewOfFile, s);   // 写// 通知其他程序,我修改了内存映射文件::PostMessage(HWND_BROADCAST, wm_Message,     (WPARAM) m_hWnd,0);
}

清理内核对象

 //取消本进程地址空间的映射,pLocalMem 为映射视图的基地址的指针UnmapViewOfFile(pLocalMem);  pLocalMem=NULL;   //关闭文件映射内核文件,hFileMapping 为内存文件映射文件句柄  CloseHandle(hFileMapping);

完整代码

实现:每打开一个程序,计数加一。

#include <iostream>
#include <Windows.h>
using namespace std;int main()
{HANDLE hMap;PINT lpMapAddr;// get file mapping's handle hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS,  // 权限:所有FALSE,                   // 不继承句柄"LYSM_Map"                // 名字);if (NULL == hMap) {// inithMap = CreateFileMapping(INVALID_HANDLE_VALUE,  // 不是真实的文件,所以写 INVALID_HANDLE_VALUENULL,                 // 同上PAGE_READWRITE,            // 该句柄对文件映射可读可写0,                       // 与下一个参数连用,表示文件映射的大小1024,                   // 与上一个参数连用,表示文件映射的大小"LYSM_Map"                // 名字);if (NULL == hMap) {goto end;}lpMapAddr = (PINT)MapViewOfFile(hMap,                        // 文件映射句柄FILE_MAP_ALL_ACCESS,       // 权限:所有0,                           // 与下一个参数连用,表示文件映射起始地址偏移0,                           // 与上一个参数连用,表示文件映射起始地址偏移0                            // 映射整个文件映射对象);*lpMapAddr = 1;}// get file mapping's addresslpMapAddr = (PINT)MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);// read cout << "instance's count : " << *lpMapAddr << endl;// write*lpMapAddr = *lpMapAddr + 1;cout << "finished." << endl;getchar();
end:if (hMap)CloseHandle(hMap);getchar();return 0;
}

效果图

CreateFileMapping 共享内存相关推荐

  1. CreateFileMapping共享内存时添加Global的作用

    来源:http://www.cnblogs.com/elvislogs/articles/ShareMemory.html 通常使用CreateFileMapping建立共享内存时名称中没有加入&qu ...

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

    进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...

  3. 进程间通信——共享内存(CreateFileMapping+MapViewOfFile)

    代码比较少,直接贴代码.发送端和接收端的代码基本相同. 发送端 // ShareMemory_Send.cpp : Defines the entry point for the console ap ...

  4. VS C++ 共享内存 CreateFileMapping

    创建共享内存 HANDLE CreateFileMapping(   HANDLE hFile,              // handle to file to map   LPSECURITY_ ...

  5. CreateFileMapping实现的共享内存及用法

    在32位的Windows系统中,每一个进程都有权访问他自己的4GB(232=4294967296)平面地址空间,没有段,没有选择符,没有near和far指针,没有near和far函数调用,也没有内存模 ...

  6. VB读写进程句柄-共享内存-内存映射CreateFileMapping

    共享内存 其实就是 一个 句柄 可以用工具查看进程句柄 中就可以发现,类似 互斥体一样的东西 然后共享内存 ,创建的是一个句柄名称 "Global\{FD921876-60EB-4799-A ...

  7. win7下使用共享内存方式CreateFileMapping失败错误码5的解决方法

    在普通应用程序中使用共享内存方式创建内存共享对象时,CreateFileMapping函数总是返回句柄为NULL,通过GetLastError得到返回错误码 0x5, 问题解决: 使用Local 代替 ...

  8. win32下进程间通信方式之管道、邮件槽、剪切板、共享内存、消息、套接字、RPC、DDE等

    #include "stdafx.h"/*32位Windows采用虚拟内存技术使每个进程虚拟4G内存,在逻辑上实现了对进程之间数据代码的分离与保护.那么相应的进程之间的通信也就有必 ...

  9. java 共享内存获取写权限_跨进程访问共享内存的权限问题

    问:我在服务器上用 CreateFileMapping 创建了一段共享内存.让这个exe始终在服务器上跑. 同时,别的用户在客户端用IE访问服务器,将要查询的数据通过C#制作的网页提交上来,服务器得到 ...

最新文章

  1. 解决k8s中node拉取镜像失败问题
  2. dede php可以传多个参数,织梦分页标签dede:pagelist传参数
  3. Oracle ORA-600 [2662] 错误
  4. 关于Windows不能在本地计算机启动Apache2.......并参考特定服务错误代码1问题解决...
  5. 揭秘罗永浩直播带货幕后之师
  6. 7-2 地下迷宫探索 (30 分)(C语言实现)
  7. 为什么脚本执行一行就不动了_在Linux中通过expect工具实现脚本的自动交互
  8. lisp scheme 果壳_common lisp和scheme的区别
  9. 【Clickhouse】Clickhouse 外部存储引擎之 File
  10. Cobra命令行框架及使用
  11. 常用ror命令行工具
  12. 【已解决】关于SQL2008 “不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了‘阻止保存要求重新创建表的更改’” 解决方案...
  13. 计算机组成原理题集,计算机组成原理试题集含答案
  14. dubbo 支持服务降级吗_Dubbo服务降级设置
  15. 数据包络(DEA)分析法python实现
  16. linux编译poco静态库,Xcode 编译poco c++静态库
  17. [转] Linux-2.6.32 NUMA架构之内存和调度
  18. 容器技术介绍之docker核心技术概述
  19. python没学历可以学习么_python没有学历好就业吗_学历低可以学习python吗
  20. ps打开图片的三种方式 同步部分基本操作方式

热门文章

  1. jenkins之获取最后一次构建结果
  2. C++/C++11中std::transform的使用
  3. Java数据结构——认识二叉树
  4. 别让孩子伤在“听话”上——韩国沉船事故带给我们的育儿启示
  5. SAP IDES 4.71下载地址:(BT种子,9.3G)
  6. LED显示屏、LED照明、LED亮化展业生产--深圳利用价格的科技有限公司
  7. CCF:201812-1 小明上学 (C语言)
  8. Windows10用fiddler抓包Android应用(解决手机设置代理后无法上网,设置只抓app包)
  9. iOS模式分析 策略模式
  10. 防火墙的各个区域互通