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

3

我对内存映射文件非常陌生,有一些迷失。

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

但在我的情况下,我正在创建一个附加到进程A的DLL,并且该DLL已经被赋予了指向由进程A准备的cSurface的指针。我需要与进程B共享该cSurface的数据。我真的不想打电话给一个空白的MMap并将我的进程A的表面复制到其中,只是为了在进程B中再次复制它。

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

我的计划理论上是在Proc A中接收表面指针,告诉Windows共享该表面的内存,并使用Mutexes协调访问-想法是两个进程都读取相同的物理副本表面,而没有繁琐的复制。

这可行吗?


只是想让我的帖子更清晰一些。假设我有一个名为char buffer[SUPER_MASSIVE]的巨大缓冲区和一个名为hSuperMassiveFile的巨大文件。我可以通过CreateFileMapping(hSuperMassiveFile,...)来共享SuperMassiveFile,但我想使用相同的方式来处理我的缓冲区。有没有办法这样做:CreateFileMapping((HANDLE)buffer,...),而不必请求一个空地图,然后将我的缓冲区复制到其中? - Chris D
2个回答

2
是的,在CreateFileMapping的文档中都有说明。
您可以给您的内存映射文件命名。如果另一个进程使用相同的名称打开了mmap,则它将指向相同的内存。如果在CreateFileMapping中的句柄放置为INVALID_HANDLE_VALUE,则它仅保留在内存中。请检查CreateFileMapping的文档。

我知道的就这么多,我的问题是如何让MMap开始包含我的数据。如果我的数据在一个文件中,并且我执行了CreateFileMapping(hMyFile, ...);,那么该映射将自动包含MyFile的内容。但是我的数据在内存中,而且很庞大。如果我执行CreateFileMapping(INVALID_HANDLE_VALUE, ...);,那么我会得到一个指向未初始化荒原的指针,然后我必须将我的大量缓冲区复制到其中,这需要时间。如果有一种方法可以从制作时开始就使地图指向我的缓冲区,那就更好了。 - Chris D
我正在创建一个 DLL,缓冲区是由父应用程序创建的。父应用程序将缓冲区的指针和大小作为函数参数传递给我。所以从我看来,我的选择是将缓冲区复制到 MMapped 区域中,或者以某种方式映射已经存在缓冲区的区域。 - Chris D

1

感谢您所有的评论。

我进行了进一步的研究并找到了答案。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接