它不必调用CreateFile函数,只需要调用CreateFileMapping函数,并且传递INVALID_HANDLE_VALUE作为hFile参数。这将告诉系统,你不是创建其物理存储器驻留在磁盘上的文件中的文件映射对象,相反,你想让系统从它的页文件中提交物理存储器。分配的存储器的数量由CreateFileMapping函数的dwMaximumSizeHigh和dwMaximumSizeLow两个参数来决定。当创建了文件映射对象并且将它的一个视图映射到进程的地址空间之后,就可以像使用任何内存区域那样使用它。
如果你想要与其他进程共享该数据,可调用CreateFileMapping函数,并传递一个以0结尾的字符串作为pszName参数。然后,想要访问该存储器的其他进程就可以调用CreateFileMapping或OpenFileMapping函数,并传递相同的名字。(见:跨越进程边界共享内核对象【命名对象】)
当进程不再想要访问文件映射对象时,该进程应该调用CloseHandle函数。当所有句柄均被关闭后,系统将从系统的页文件中收回已经提交的存储器。
// ------------------------------------------------------------
// 文件名 : 17_FileMapping3.cpp
// 创建者 : 方煜宽
// 邮箱 : fangyukuan@gmail.com
// 创建时间 : 2010-9-6 17:19
// 功能描述 : 页文件支持的内存映射文件
//
// ------------------------------------------------------------
#include "stdafx.h"
#include "windows.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
// 它不必调用CreateFile函数,注释掉
// HANDLE hFile = ::CreateFile(L"C:\\kuan.txt",
// GENERIC_READ | GENERIC_WRITE,
// 0,
// NULL,
// OPEN_ALWAYS,
// FILE_ATTRIBUTE_NORMAL,
// NULL);
// 传递INVALID_HANDLE_VALUE作为hFile参数
HANDLE hFileMapping = ::CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0, 99, // 注意这里不能再是0了。
NULL);
PBYTE pbFile1 = (PBYTE)::MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
PBYTE pbFile2 = (PBYTE)::MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
cout << "View1:" << pbFile1 << endl;
cout << "View2:" << pbFile2 << endl;
// 改变视图
memcpy(pbFile1, "fangyukuan" , 10);
// 结果视图和都变了
cout << "View1:" << pbFile1 << endl;
cout << "View2:" << pbFile2 << endl;
::UnmapViewOfFile(pbFile1);
::UnmapViewOfFile(pbFile2);
::CloseHandle(hFileMapping);
//::CloseHandle(hFile);
return 0;
}