现在的位置: 首页 > 综合 > 正文

用内存映射在多个应用程序之间共享数据

2019年06月10日 ⁄ 综合 ⁄ 共 1480字 ⁄ 字号 评论关闭

文件的内存映射的主要用途有两个方面,第一是用来在多个进程之间共享数据,第二是直接用内存映射文件来访问磁盘上的数据文件,无需要进行文件的I/O操作。进程间共享数据有很多种方法,今天,我主要讲的是内存映射的这种方法。

         在内存映射文件是在多个进程之间共享一个数据块的重要方法。通过调用API函数CreateFileMapping()可以像对待一个文件那样对待一个内存区。

         内存映射文件的使用可以分为以下三步:

(1)      用CreateFileMapping()创建一个文件映射内核对象;

(2)      用MapViewOfFile()将文件数据映射到进程的地址空间;

(3)      用UnmapViewOfFile()从进程地址空间解除这个映射。

首先,我开始讲讲这几个API函数,摘自visualstudio 2010帮助文档。

CreateFileMapping

MapViewOfFile

UnmapViewOfFile

这里只是简单的贴出了地址,我讨厌整片的复制一堆过来充当自己的博客内容。
接下来是自己写的一个测试代码:
运行效果如下:


部分代码:
m_hMapObject = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 0x1000, _T("shared_memory"));

	if (!m_hMapObject)
	{
		AfxMessageBox(_T("Unable to create shared memory file."));
		return FALSE;
	}

	// Map view of file into our address space
	m_pszMapView = (LPSTR)MapViewOfFile(m_hMapObject, FILE_MAP_WRITE, 0, 0, 0);

	if (!m_pszMapView)
	{
		AfxMessageBox(_T("Unable to map shared memory file."));
		return FALSE;
	}

就如前面所说的,按照三步来完成。其实,如果你按照这三步骤来完成,理解其中的意思,还是很简单的。

m_hMapObject = OpenFileMapping(FILE_MAP_READ, FALSE, _T("shared_memory"));

	if (!m_hMapObject)
	{
		AfxMessageBox(_T("Can't open shared memory file."));
		return FALSE;
	}

	// Get pointer to shared data
	m_pszMapView = (LPSTR)MapViewOfFile(m_hMapObject, FILE_MAP_READ, 0, 0, 0);

	if (!m_pszMapView)
	{
		AfxMessageBox(_T("Can't map view of shared memory file."));
	}


完整的工程这里提供下载地址(注:这个工程是在使用vs2010建的,如果使用低版本的vs出现错误,请使用vs2010编译。

单击这里下载

最后祝大家中秋节快乐!!!

抱歉!评论已关闭.