gpt4 book ai didi

c - 为什么 MapViewOfFile 会因 ERROR_ACCESS_DENIED 而失败?

转载 作者:太空狗 更新时间:2023-10-29 17:06:40 29 4
gpt4 key购买 nike

我在使用 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 的相同大小,返回 NULLGetLastError 返回0x05:ERROR_ACCESS_DENIED。该进程以管理员权限运行。

MSDN 文档并未真正提及出现这种情况的任何原因。那么为什么CreateFileMapping成功了,而MapViewOfFile却失败了呢?

最佳答案

在经历了很多痛苦之后,我终于找到了导致我的应用程序出现此错误的原因,以防其他人遇到同样的问题,问题不在于 MapViewOfFile 方法,而在于 CreateFileMapping,即 createFileMapping 的大小应该是文件的大小,而不是要读取的元素的大小,如果你不知道大小那么它应该是 0,这不适用于 MapViewOfFile 作为要传递的值,因为大小是 block 你想读/写。

您的代码将如下所示:

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());

只是把它放在这里是为了记录我发现的内容,不幸的是,当您不知道是什么原因导致它时,很难搜索到这个错误。我希望这可以为其他人节省几个小时。

关于c - 为什么 MapViewOfFile 会因 ERROR_ACCESS_DENIED 而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16027268/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com