【问题标题】:Shared memory: MapViewOfFile returns error 5共享内存:MapViewOfFile 返回错误 5
【发布时间】: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


【解决方案1】:

答案在 cmets 中:

PAGE_READWRITE 不是OpenFileMapping() 的有效参数。你可能想要FILE_MAP_ALL_ACCESS。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 2012-06-19
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2012-01-26
    相关资源
    最近更新 更多