2011-03-30 71 views
2

MSDN说为什么MapViewOfFile不会失败?

如果一个文件映射对象由分页文件(的CreateFileMapping调用与设置为INVALID_HANDLE_VALUE的HFILE参数)的支持下,分页文件必须大到足以容纳整个映射。如果不是,MapViewOfFile失败

但是,即使页面文件不存在,此代码也能正常工作。为什么?

HANDLE mm; 
LPVOID addr; 

mm = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1024 * 1024, NULL); 
if (mm != NULL) { 
    addr = MapViewOfFile(mm, FILE_MAP_ALL_ACCESS, 0, 0, 1024 * 1024); 

    if (addr != NULL) { 
     MessageBox(0, NULL, NULL, 0); 
    } 
} 
+1

你是如何删除页面文件的? – 2011-03-30 11:02:51

+0

该代码看起来应该明确地不_在没有页面文件的系统上显示一个消息框(只是为了确定,你说的是_does_显示消息框?)。鉴于SEC_COMMIT,操作系统必须确保内存实际上存在(不仅在理论上与SEC_RESERVE中一样),我没有看到没有页面文件的情况下它是如何实现的,除非将整个内存锁定为非内存可以分页,这当然不会。 – Damon 2011-03-30 11:05:29

+0

显然你错了,系统仍然有一个页面文件要解决,否则调用就会失败。 – 2011-03-30 13:32:52

回答

2

那么,它为什么会失败?使用VirtualAlloc()分配的页面也会映射到页面文件。这并不失败,你不能得到任何真正的计划开始。否则创建一个没有被页面文件支持的MMF是没有问题的,内存不能被映射,它永久卡在RAM中。

不要认为当你做这种不寻常的事情时,记录的规则仍然有效。