2011-03-30 70 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中。

不要認爲當你做這種不尋常的事情時,記錄的規則仍然有效。