我对Memory Mapped Files非常陌生,而且我对某些事情感到有些迷失。
我知道如果我有一个文件,我可以加载它并使用MMaps一次从各种进程访问它。
但在我的情况下,我正在创建一个附加到进程A的DLL,并且该DLL已经被指定了一个指向进程A准备好的cSurface的指针。我需要与进程B共享该cSurface的数据。我真的不想调用一个空白的MMap并将我的进程A表面复制到其中,只是在进程B中再次将其复制出来。
是否可以将我的曲面映射为一个文件,这样MMap在创建时就已经指向了曲面数据(就像我加载SomeTextFile.txt一样)?
理论上,我的计划是接收一个指向过程A中表面的指针,告诉窗口用给定名称共享该表面的内存,并使用互斥锁来协调访问 - 这个想法是两个进程都读取相同的表面的物理副本,没有繁琐的复制。
这可能吗?
答案 0 :(得分:2)
是的,这就是CreateFileMapping文档中的所有内容。
您可以为内存映射文件命名。如果另一个进程打开一个具有相同名称的mmap,它将指向相同的内存。它将CreateFileMapping中的句柄放到INVALID_HANDLE_VALUE,它将它纯粹保留在内存中。查看CreateFileMapping
的文档答案 1 :(得分:1)
感谢您的所有评论。
我做了一些进一步的研究,找到了答案。
您可以使用内存映射文件共享文件或空白内存空间。如果要在设置地图之前共享已在内存中初始化的数据,则必须创建空白地图,然后将数据复制到其中。