我正在尝试使用 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
是 documented behavior并且表示您确实收到句柄的情况,但它是已存在对象的句柄,而不是创建的。
OpenFileMapping
不工作的问题在于它的第一个参数:API 函数需要来自另一个枚举的值/标志,它采用 FILE_MAP_*
值而不是 页_*
。不正确的参数导致无法打开您想要的映射。
关于c++ - CreateFileMapping 和 OpenFileMapping 在不同进程中不合作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12498553/