我通过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());

只是将其放在此处以记录我发现的内容,不幸的是,当您不知道造成此错误的原因时,很难找到该错误。我希望这可以为其他人节省几个小时。

10-07 13:37