CreateFileMapping 和 OpenFileMapping 在不同的进程中不合作
CreateFileMapping and OpenFileMapping not cooperating in different processes
我正在尝试使用 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());
希望这可以为其他开发人员节省数小时。
相关文章:
- 终止 QProcess 不会终止子进程
- pclose() 不会给我进程退出代码
- 先进先出:一个进程永远不会从管道读取
- 如何保护非托管应用程序中的字符串不受进程转储的影响
- 我试图创建进程的二叉树结构,其中每个进程不超过 2 个子进程
- 将 DLL 附加到托管进程不起作用
- C :GOTO和用户输入不合作
- 创建进程不继承父环境
- CreateFileMapping 和 OpenFileMapping 在不同的进程中不合作
- c++进程不会停止
- 父进程不读取管道表单
- 创建进程不会用参数启动过程
- 如何保护进程不被终止
- C++守护进程不会收到 SIGCHLD 信号
- Windows:如何在C/C++中保护进程不被杀死
- 当子进程不刷新其stdout时,如何从子进程读取stdout
- 创建进程不会将命令行参数传递给新进程的主函数
- Poco进程不退出
- 是否有像WaitNamedPipe这样的函数或在c++ /linux上实现此功能的方法?(因此进程不会在管道上阻塞无限时
- 当没有waitForFinished()时,进程不发出信号