2

我正在尝试使用 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();
4

2 回答 2

8

从一开始就需要注意的简单事项:

  • 错误代码 5:ERROR_ACCESS_DENIED“访问被拒绝。”
  • 错误代码 183:ERROR_ALREADY_EXISTS“当该文件已存在时无法创建该文件。”

ERROR_ALREADY_EXISTS记录在案的行为,表明您确实收到了句柄,但它是已经存在的对象的句柄,而不是创建的。

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

于 2012-09-19T16:36:58.783 回答
2

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

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

为了解决这个问题,代码应该是这样的:

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

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

于 2015-01-03T09:44:46.540 回答