文档章节

Windows 内存映射

NiuYoohoo
 NiuYoohoo
发布于 2017/05/24 18:16
字数 203
阅读 51
收藏 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
赣州
私信 提问
为 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
[mystery]-加密解密整理

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

wbf961127
2017/11/14
0
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

没有更多内容

加载失败,请刷新页面

加载更多

FinderWeb2.4.9 程序员的看日志利器

FinderWeb2.4.9 程序员的看日志利器

吴伟祥
1分钟前
0
0
PHP的pcntl进程控制教程一(pcntl_fork)

pcntl 简介 PHP的进程控制支持实现了Unix方式的进程创建, 程序执行, 信号处理以及进程的中断。 进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。 这份文档...

hansonwong
6分钟前
0
0
php扩展模块安装

11月21日任务 11.32 php扩展模块装安装 /usr/local/php/bin/php -m //查看模块 下面安装一个redis的模块 cd /usr/local/src/ wget https://codeload.github.com/phpredis/phpredis/zip/deve......

zgxlinux
7分钟前
0
0
windows下使用IDEA创建VUE项目

1.环境搭建 1.1检测是否安装好nodejs和npm 检测命令 node -v npm -v 如果没有安装需要先安装 nodejs的下载路径:https://nodejs.org/en/download/ 在Windows上安装时务必选择全部组件,包括勾...

文文1
14分钟前
1
0
Mybatis插件plugin应用测试,替换查询sql

1、新建插件 import org.apache.ibatis.executor.CachingExecutor;import org.apache.ibatis.executor.Executor;import org.apache.ibatis.executor.parameter.ParameterHandler;im......

jcc_codingBoy
19分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部