文档章节

Windows 内存映射

NiuYoohoo
 NiuYoohoo
发布于 2017/05/24 18:16
字数 203
阅读 48
收藏 1
点赞 0
评论 0

创建和打开内存映射

class MemoryShare
{
public:
	static HANDLE CreateMemoryMap(std::string id, size_t shared_mem, void* &map_buf)
	{
		return MemoryShare::CreateMemoryMap(id, shared_mem, "", map_buf);
	}
	static HANDLE CreateMemoryMap(std::string id, size_t shared_mem, std::string file, void* &map_buf)
	{
		HANDLE hFile = NULL;
		HANDLE hMap = NULL;
		if (!file.empty())
			hFile = CreateFileA(file.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | 
			FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

		if (hFile)
		{
			hMap = CreateFileMappingA(hFile, NULL, PAGE_READWRITE, 0, shared_mem, id.c_str());
		}
		else
		{
			hMap = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, shared_mem, id.c_str());
		}
		if (hMap == NULL)
		{
			if (hFile)
				CloseHandle(hFile);
			return false;
		}

		map_buf = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
		if (!map_buf)
		{
			if (hFile)
				CloseHandle(hFile);
			CloseHandle(hMap);
			hMap = NULL;
			return false;
		}
		if (hFile)
			CloseHandle(hFile);
		return hMap;

	}
	static bool OpenMemoryMap(std::string id, size_t map_size,void* &map_buf)
	{
		HANDLE hMap = OpenFileMappingA(FILE_MAP_ALL_ACCESS, 0, id.c_str());
		if (!hMap)
		{
			return false;
		}
		map_buf = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, map_size);
		if (!map_buf)
		{
			CloseHandle(hMap);
			return false;
		}
		CloseHandle(hMap);
		return true;
	}
	static void CloseMemoryMap(void* base_map)
	{
		if (base_map)
			UnmapViewOfFile(base_map);
	}

};

Example

void* pto = NULL;
HANDLE hMem = MemoryShare::CreateMemoryMap("yoohoo", 3000, "G:/a.txt", pto);
if (hMem)
{
	memcpy(pto, "123456789", 10);
}

void* pmap = NULL;

if (MemoryShare::OpenMemoryMap("yoohoo", 256, pmap))
{
	cout << (char*)pmap;
}

getchar();
if (hMem)
	CloseHandle(hMem);
MemoryShare::CloseMemoryMap(pmap);

 

© 著作权归作者所有

共有 人打赏支持
NiuYoohoo
粉丝 1
博文 48
码字总数 18987
作品 0
赣州
Windows xp/Vista/Linux的内核映射以及内存置换算法

linux的内存管理我认为是高效的,windows xp的我认为是豪华的,vista的呢?我认为是无以伦比的(理论是无以伦比,但是实际上不是那样)。 linux把内核的主要数据结构映射到内核空间3g到3g+76...

晨曦之光
2012/04/10
303
0
为 SQL Server 启用 AWE 内存

为 SQL Server 启用 AWE 内存 RECONFIGUREGO sp_configure 'awe enabled', 1RECONFIGUREGO RECONFIGUREGO sp_configure 'max server memory', 6144RECONFIGUREGO...

光石头
2011/06/03
0
0
缓存的位置

缓存的位置是很有说头的,在windows里,因为内核设计思想就是将一切都映射到虚拟内存空间(便于通过其强大又复杂的内存管理器来进行一致化管理),那么文件缓存当然也映射了一片虚拟内存(记...

晨曦之光
2012/04/10
122
0
System.IO之内存映射文件共享内存

内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就像操作进程空间里的地址一样了,比如使用c语言的memcpy等内存操作的函数。这种方法能够很好的应用在需...

长平狐
2012/06/08
130
0
关于linux栈的一个深层次的问题

内存不用白不用,何必在一开始就限制栈的大小,linux的机制是尽量多尽量紧凑的使用虚拟内存,原则就是你现在不用我就用,没有预留的概念,当然你可以通过系统调用实现预留,就像glibc的堆管理...

晨曦之光
2012/04/10
886
0
[mystery]-加密解密整理

小续 这也是我11年看加密解密时写的一点笔记,因为后面有事,所以笔记并不完整,不过也涉及到很多知道了,写给爱好加密解密的朋友 多字节数据是按怎样的顺序存放的呢?实际情况和CPU有关,微...

wbf961127
2017/11/14
0
0
【IT基础】加密解密整理

小续 这也是我11年看加密解密整理的一些笔记,因为后面有事,所以这个笔记并不完整,不过也涉及到很多知识了,写给爱好加密解密的朋友 多字节数据是按怎样的顺序存放的呢?实际情况和CPU有关...

wbf961127
2017/11/14
0
0
linux的页表为什么没有实现自映射

玩过windows内核的都应该知道windows为了节省4k的内存,实现了自映射,将页目录本身当作了一个页表来寻址4M的虚拟空间(将4M空间的虚 拟内存映射到物理内存),而这4m的虚拟地址空间恰恰就是...

晨曦之光
2012/04/10
500
0
配置 SQL Server 以便使用 2 GB 以上的物理内存(包括SQL Server 2005)

1. 概要 使用Windows 2000 Server 的操作系统,对于SQL Server而言,需要打开操作系统的3G开关,它才能利用到2G以上的物理内存,否则这些4G以上内存只有2G能够被SQL Server使用到。 如果服务...

springfe
2008/03/09
0
0
更新整理本人所有博文中提供的代码与工具(C++,2013.10)

  为了更方便地管理博文中涉及的各种代码与工具资源,现在把这些资源迁移到 Google Code 中,有兴趣者可前往下载。 C++ 1、《通用高性能 Windows Socket 组件 HP-Socket v2.2.3 正式发布》...

伤神小怪兽
2013/10/10
654
10

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Tomcat中JAVA JVM内存溢出及合理配置

一、Java JVM内存介绍 JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创...

學無止境
6分钟前
0
0
centOS7.4+nginx 1.12.2负载均衡

centOS7.4+nginx 1.12.2负载均衡 2018年04月10日 09:24:51 阅读数:58 1:参数信息 三台 centOS7.4 A,B,C A作为主服务器,B C作为分流的服务器 都搭建 nginx 1.12.2 一:安装 nginx 1:下载...

linjin200
11分钟前
0
0
分布式之抉择分布式锁

前言: 目前网上大部分的基于zookpeer,和redis的分布式锁的文章都不够全面。要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫。坦白说,这种老题材,很难写出新创意,博...

Java大蜗牛
16分钟前
0
0
rm: cannot remove `xxx’: Operation not permitted

rm: cannot remove `xxx': Operation not permitted可以先用lsattr xxx查看文件的隐藏属性。如果看到-----a-------的情况,可以用chattr -a xxx去除a属性,然后再进行删除就可以了....

殘留回憶
17分钟前
0
0
oracle 如何查看当前用户的表空间名称

如何查询当前用户的表空间名称?因为oracle建立索引,需要知道当前用户的表空间,查找了一下资料 --查询语法-- select default_tablespace from dba_users where username='登录用户' 如,...

youfen
21分钟前
0
0
MicroPython-TPYBoard开发板DIY小型家庭气象站

对于喜欢登山的人来说,都会非常关心自己所处的高度跟温度,海拔高度的测量方法,海拔测量一般常用的有两种方式,一是通过GPS全球定位系统,二是通过测出大气压,根据气压值算出海拔高度。 ...

bodasisiter
21分钟前
0
0
抓取沪A股票资金流向数据

library(rvest)mydata<-list()day1<-Sys.Date()day2<-Sys.Date()-7stock<-c("600695","600734","603693","601990","603650","603045","603895","600735","601999","603970","600619"......

cuyi
21分钟前
0
0
Java中mqtt消息队列发送和订阅消息

1.首先本地建立mqtt协议的服务器 2.直接上代码 package io.powerx.test;import java.util.Date;import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;import org.eclipse.p......

江湖鱼大虾
23分钟前
0
0
数据结构-树的学习

1. 相关连接 维基-二叉搜索树 维基-红黑树 思否-红黑树1 思否-红黑树2

liuyan_lc
25分钟前
0
0
Dubbo 源码解读——自定义 Classloader 之 ExtensionLoader

众所周知,Dubbo 是阿里巴巴公司自主研发开源的一个高性能的服务框架(现已捐献给 Apache 基金会组织),应用之间可以通过 RPC 的方式来互相调用并返回结果。主要基于 Java 语言开发,它提供...

Ryan-瑞恩
34分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部