CreateFileMapping 和 OpenFileMapping 在不同的进程中不合作

CreateFileMapping and OpenFileMapping not cooperating in different processes

本文关键字:进程 不合作 OpenFileMapping CreateFileMapping      更新时间:2023-10-16

我正在尝试使用 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_EXISTS是记录的行为,指示你确实收到句柄的方案,但它是现有对象的句柄,而不是创建的。

OpenFileMapping不起作用的问题在于它的第一个参数:API 函数需要来自另一个枚举的值/标志,它接受FILE_MAP_*值而不是PAGE_* 。不正确的参数会导致无法打开所需的映射。

如果其他人需要,在我的情况下,错误与对文件的访问无关,而是与提供给 CreateFileMap 的大小有关,在花费数小时出现类似错误后,我会使用发布在其他地方的工作示例并逐行比较有什么区别。

如果在执行 CreateFileMapping 时不知道文件的大小,则需要使用 0,这将告诉 API 使用映射文件的文件大小。SO中围绕这个问题的大多数答案都是错误的,人们没有费心测试问题是什么,我浪费了几个小时阅读其他具有类似建议的帖子。

要解决此问题,代码应如下所示:

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

希望这可以为其他开发人员节省数小时。