文件的内存映射的主要用途有两个方面,第一是用来在多个进程之间共享数据,第二是直接用内存映射文件来访问磁盘上的数据文件,无需要进行文件的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编译。)
最后祝大家中秋节快乐!!!