关于c ++:CreateFileMapping和OpenFileMapping在不同进程中不协作

CreateFileMapping and OpenFileMapping not cooperating in different processes

我正在尝试使用CreateFileMapping和OpenFileMapping在进程之间共享内存。 这不起作用,我希望这样做-OpenFileMapping返回null,GetLastError为5-访问被拒绝。 有什么想法我做错了吗? 名称类似于MemoryTest。

编辑:

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

1
2
3
4
5
6
7
8
9
10
11
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();

其他过程:

1
2
3
4
5
6
7
8
9
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();

但是,这适用于第二个过程:

1
2
3
4
5
6
7
8
9
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_*。不正确的参数导致无法打开所需的映射。


如果有人需要,就我而言,该错误与文件的访问无关,这与提供给CreateFileMapping的大小有关,在花费了类似的错误数小时之后,我想使用其他地方发布的工作示例,逐行比较有什么区别。

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

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

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

希望这可以节省其他开发人员的时间。