【发布时间】:2011-03-30 10:52:57
【问题描述】:
MSDN 说
如果文件映射对象由页面文件支持(调用 CreateFileMapping 时将 hFile 参数设置为 INVALID_HANDLE_VALUE),页面文件必须足够大以容纳整个映射。如果不是,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);
}
}
【问题讨论】:
-
你是如何删除页面文件的?
-
代码看起来应该明确不在没有页面文件的系统上显示消息框(只是为了确定,你说的是确实 i> 显示消息框?)。鉴于 SEC_COMMIT,操作系统必须确保内存确实存在(不仅在理论上,就像在 SEC_RESERVE 中一样),我不知道它如何在没有页面文件的情况下做到这一点,除了将整个内存锁定为非-pageable,它肯定不会这样做。
-
显然你错了,系统还有一个页面文件要寻址,否则调用就会失败。
-
页面文件不存在。我在系统属性->性能->虚拟内存中设置了“无页面文件”。
-
是的,它确实显示了消息框。
标签: winapi