我通过WinAPI的 MapViewOfFile
函数遇到了这种情况。互联网搜索未发现任何明显的修复,因此在这里我将分享我的问题和解决方案。
考虑以下代码段:
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
失败? 最佳答案
经过一番苦难后,我终于找到了导致我的应用程序中此错误的原因,以防万一其他人为之苦恼,问题不是与MapViewOfFile方法有关,而是与CreateFileMapping有关,createFileMapping的大小应为文件的大小,而不是要读取的元素的大小,如果您不知道大小,则该大小应为0,这不适用于MapViewOfFile,因为要传递的值是size,即大小是您想要的块的长度读/写。
您的代码工作将如下所示:
const char *name = "Global\\Object_Name";
unsigned long size = get_object_size();
HANDLE handle = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
0,
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());
只是将其放在此处以记录我发现的内容,不幸的是,当您不知道造成此错误的原因时,很难找到该错误。我希望这可以为其他人节省几个小时。