它不必调用CreateFile 函数,只需要调用CreateFileMapping 函数,并且传递 INVALID_HANDLE_VALUE 作为hFile 参数。这将告诉系统,你不是创建其物理存储器驻留在磁盘上的文件中的文件映射对象,相反,你想让系统从它的页文件中提交物理存储器。分配的存储器的 数量由CreateFileMapping 函数的dwMaximumSizeHigh 和dwMaximumSizeLow 两个参数来决定 。 当创建了文件映射对象并且将它的一个视图映射到进程 的地址空间之后,就可以像使用任何内存区域那样使用它。
如果你想要与其他进程 共享该数据 ,可调用CreateFileMapping 函数,并传递一个以0 结尾的字符串作为pszName 参数。然后,想要访问该存储器的其他进程就可以调用CreateFileMapping 或OpenFileMapping 函数,并传递相同的名字。(见:跨越进程边界共享内核对象【命名对象】 )
当进程不再想要访问文件映射对象时,该进程应该调用CloseHandle 函数。当所有句柄均被关闭后,系统将从系统的页文件中收回已经提交的存储器。
// ------------------------------------------------------------
// 文件名 : 17_FileMapping3.cpp
// 创建者 : 方煜宽
// 邮箱 : [email protected]
// 创建时间 : 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;
}
本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/09/09/1822304.html