内存映射文件 - 映射结构而不是文件?

时间:2012-01-12 13:02:11

标签: c++ windows winapi shared-memory

我对Memory Mapped Files非常陌生,而且我对某些事情感到有些迷失。

我知道如果我有一个文件,我可以加载它并使用MMaps一次从各种进程访问它。

但在我的情况下,我正在创建一个附加到进程A的DLL,并且该DLL已经被指定了一个指向进程A准备好的cSurface的指针。我需要与进程B共享该cSurface的数据。我真的不想调用一个空白的MMap并将我的进程A表面复制到其中,只是在进程B中再次将其复制出来。

是否可以将我的曲面映射为一个文件,这样MMap在创建时就已经指向了曲面数据(就像我加载SomeTextFile.txt一样)?

理论上,我的计划是接收一个指向过程A中表面的指针,告诉窗口用给定名称共享该表面的内存,并使用互斥锁来协调访问 - 这个想法是两个进程都读取相同的表面的物理副本,没有繁琐的复制。

这可能吗?

2 个答案:

答案 0 :(得分:2)

是的,这就是CreateFileMapping文档中的所有内容。

您可以为内存映射文件命名。如果另一个进程打开一个具有相同名称的mmap,它将指向相同的内存。它将CreateFileMapping中的句柄放到INVALID_HANDLE_VALUE,它将它纯粹保留在内存中。查看CreateFileMapping

的文档

答案 1 :(得分:1)

感谢您的所有评论。

我做了一些进一步的研究,找到了答案。

您可以使用内存映射文件共享文件空白内存空间。如果要在设置地图之前共享已在内存中初始化的数据,则必须创建空白地图,然后将数据复制到其中。