【问题标题】:Why MapViewOfFile doesn't fail?为什么 MapViewOfFile 不会失败?
【发布时间】: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


【解决方案1】:

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

当您做这种不寻常的事情时,不要假设记录在案的规则仍然有效。

【讨论】:

    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 2016-04-11
    • 2021-10-10
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多