【发布时间】:2013-04-08 06:44:35
【问题描述】:
我在 WinAPI 的 MapViewOfFile 函数中遇到了这种情况。互联网搜索没有发现任何明显的修复,所以我将在这里分享我的问题和解决方案。
考虑以下 sn-p:
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 失败呢?
【问题讨论】:
标签: c winapi shared-memory