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 "该文件已存在时无法创建文件。"
如果有人需要,就我而言,该错误与文件的访问无关,这与提供给CreateFileMapping的大小有关,在花费了类似的错误数小时之后,我想使用其他地方发布的工作示例,逐行比较有什么区别。
如果在执行CreateFileMapping时不知道文件大小,则需要使用0,这将告诉API使用映射文件的文件大小。 SO中有关此问题的大多数答案都是错误的,人们不会费心测试问题所在,我浪费了很多时间阅读具有类似建议的其他帖子。
要解决该问题,代码应如下所示:
1 | var map_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0, name.c_str()); |
希望这可以节省其他开发人员的时间。