c++ - CreateFileMapping 和 OpenFileMapping 在不同进程中不合作

标签 c++ winapi shared-memory

我正在尝试使用 CreateFileMapping 和 OpenFileMapping 在进程之间共享内存。这没有像我希望的那样工作 - OpenFileMapping 返回 null 并且 GetLastError 为 5 - 访问被拒绝。知道我做错了什么吗?名称类似于 MemoryTest。

编辑:

两次使用 CreateFileMapping 我都可以读取在另一个进程中写入的数据。这是一个问题的原因是我收到错误 183 - 内存区域已存在。但是,它仍然会返回现有内存的句柄。

var map_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(int), name.c_str());

....

var handle = MapViewOfFile(map_handle, FILE_MAP_ALL_ACCESS , 0, 0, 0)

*handle = 10;

UnMapViewOfFile(map_handle);

getchar();

其他过程:

var map_handle = OpenFileMapping(PAGE_READWRITE, false, name.c_str())

....

var handle = MapViewOfFile(map_handle, FILE_MAP_ALL_ACCESS , 0, 0, 0) //returns null

var out = *handle;

getchar();

虽然这适用于第二个过程:

var map_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(int), name.c_str());

....

var handle = MapViewOfFile(map_handle, FILE_MAP_ALL_ACCESS , 0, 0, 0) //returns null

var out = *handle;

getchar();

最佳答案

从一开始就需要注意的简单事项:

  • 错误代码 5:ERROR_ACCESS_DENIED“访问被拒绝。”
  • 错误代码 183:ERROR_ALREADY_EXISTS“当文件已存在时无法创建文件。”

ERROR_ALREADY_EXISTSdocumented behavior并且表示您确实收到句柄的情况,但它是已存在对象的句柄,而不是创建的。

OpenFileMapping 不工作的问题在于它的第一个参数:API 函数需要来自另一个枚举的值/标志,它采用 FILE_MAP_* 值而不是 页_*。不正确的参数导致无法打开您想要的映射。

关于c++ - CreateFileMapping 和 OpenFileMapping 在不同进程中不合作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12498553/

相关文章:

c - 用于管理共享映射文件的库或工具

c++ - std::set 已经包含成员,即使它不同

c++ - 使用来自文件的输入创建变量

c++ - ExpandEnvironmentStrings 不扩展我的变量

C++ Boost 为两个不同的进程创建共享内存

c++ - 如何在 boost (c++) 中将内存页锁定到物理 RAM?

c++ - 如何在 Opencv 中绘制匹配项?

c++ - 错误 : no match for 'operator<' (operand types are '<unresolved overloaded function type>' and 'Color' )

windows - Spy++ 如何构建它的进程列表?

.net - 我的 .NET 2.0 应用程序将继续工作多久?