Winapi 为什么MapViewOfFile没有';你不会失败吗?

Winapi 为什么MapViewOfFile没有';你不会失败吗?,winapi,Winapi,MSDN说 如果文件映射对象由分页文件支持(调用CreateFileMapping时,将hFile参数设置为无效的\u HANDLE\u值),分页文件必须足够大,以容纳整个映射。否则,MapViewOfFile将失败 但即使页面文件不存在,此代码也可以工作。为什么? HANDLE mm; LPVOID addr; mm = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1024 * 1

MSDN说

如果文件映射对象由分页文件支持(调用CreateFileMapping时,将hFile参数设置为无效的\u HANDLE\u值),分页文件必须足够大,以容纳整个映射。否则,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);
    }
}

那么,为什么它会失败呢?使用VirtualAlloc()分配的页面也映射到分页文件。这不会失败,你无法启动任何真正的程序。否则,创建不受分页文件支持的MMF不会有任何问题,内存无论如何都不能取消映射,它永久地卡在RAM中


当您执行这种不寻常的操作时,不要假设文档中的规则仍然有效。

您是如何删除页面文件的?代码看起来应该不会在没有页面文件的系统上显示messagebox(请确定,您是说它确实显示了messagebox?)。考虑到Secu提交,操作系统必须确保内存确实存在(不仅在理论上与Secu RESERVE相同),我不认为没有页面文件,它怎么能做到这一点,除了将整个内存锁定在RAM中作为不可分页的内存之外,这是肯定不会做到的。显然你错了,系统仍然有一个页面文件要寻址,否则调用就会失败。页面文件不存在。我在系统属性->性能->虚拟内存中设置了“无页面文件”。是的,它会显示消息框。