我在WinAPI的MapViewOfFile
函數中遇到過這種情況。互聯網搜索沒有出現任何明顯的修復,所以我會在這裏分享我的問題和解決方案。爲什麼MapViewOfFile會因ERROR_ACCESS_DENIED失敗?
考慮下面的代碼片段:
const char *name = "Global\\Object_Name";
unsigned long size = get_object_size();
HANDLE handle = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
size,
name);
if (!handle || handle == INVALID_HANDLE_VALUE)
exit(GetLastError());
bool created = GetLastError() == 0;
void *block = MapViewOfFile(handle,
FILE_MAP_ALL_ACCESS,
0,
0,
size);
if (block == NULL)
exit(GetLastError());
在一個特定的情況下,CreateFileMapping
成功返回的句柄。 GetLastError
正在返回ERROR_ALREADY_EXISTS
,所以created == false
。現在,調用MapViewOfFile
,使用我傳遞給CreateFileMapping
相同的大小,返回NULL
和GetLastError
回報0x05
:ERROR_ACCESS_DENIED
。該進程以管理員權限運行。
MSDN文檔並沒有真正提到這種情況發生的原因。那麼爲什麼CreateFileMapping
成功,但MapViewOfFile
失敗?