文档章节

Windows 内存映射

NiuYoohoo
 NiuYoohoo
发布于 2017/05/24 18:16
字数 203
阅读 50
收藏 1

创建和打开内存映射

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
博文 49
码字总数 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
C++共享内存实现(windows和linux)

版权声明:原创文章如需转载,请在左侧博主描述栏目扫码联系我并取得授权,谢谢 https://blog.csdn.net/u012234115/article/details/82114631 共享内存是一种进程间通信的方式,速度比较快 ...

踏莎行hyx
08/27
0
0
缓存的位置

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

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

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

长平狐
2012/06/08
130
0

没有更多内容

加载失败,请刷新页面

加载更多

Kali Linux Docker 練習

docker pull kalilinux/kali-linux-docker docker run -t -i kalilinux/kali-linux-docker /bin/bash apt-get update apt-get install htop apt-get install nmap apt-get install wpscan ap......

BaiyuanLab
今天
1
0
通俗大白话来理解TCP协议的三次握手和四次分手

最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就...

onedotdot
今天
2
0
TiDB 在爱奇艺的应用及实践

爱奇艺,中国高品质视频娱乐服务提供者,2010 年 4 月 22 日正式上线,推崇品质、青春、时尚的品牌内涵如今已深入人心,网罗了全球广大的年轻用户群体,积极推动产品、技术、内容、营销等全方...

TiDB
今天
1
0
Web系统大规模并发:电商秒杀与抢购

一、大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常...

xtof
今天
3
0
代码质量管理平台-sonarqube

在工作中,往往开发的时候会不怎么注重代码质量的人很多,存在着很多的漏洞和隐患等问题,sonarqube可以进行代码质量的审核,而且十分的残酷。。。。。接下来我们说下怎么安装 进入官网下载:...

落叶清风
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部