【发布时间】:2019-03-07 22:38:01
【问题描述】:
我需要一种机制来在一些线程之间共享内存(通常在同一个进程中,但有时不是)。
这段代码看起来很基本,但在MapViewOfFile 上失败并出现错误 5(访问被拒绝):
HANDLE hSharedMemCreated = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
10000, // maximum object size (low-order DWORD)
"testFileMapping"); // name of mapping object
HANDLE hSharedMemOpened = OpenFileMapping(
PAGE_READWRITE, // read/write access
FALSE,
"testFileMapping"
);
void* location = MapViewOfFile(
hSharedMemOpened, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
10);
-
MapViewOfFile成功打开句柄hSharedMemOpened并获得权限FILE_MAP_READ。 -
MapViewOfFile成功创建句柄hSharedMemCreated并获得权限FILE_MAP_ALL_ACCESS。 -
MapViewOfFile使用权限FILE_MAP_ALL_ACCESS打开句柄hSharedMemOpened失败。
【问题讨论】:
-
在
MapViewOfFile()中,FILE_MAP_ALL_ACCESS等价于FILE_MAP_WRITE。您确定要打开一个使用写权限创建的映射对象吗?您是否在不同的进程中调用CreateFileMapping()和OpenFileMapping()?如果没有,你根本不应该一起使用它们,更不用说给映射对象命名了。 -
PAGE_READWRITE不是OpenFileMapping()的有效参数。你可能想要FILE_MAP_ALL_ACCESS。
标签: c++ winapi shared-memory