2012-01-12 157 views
3

我对内存映射文件非常陌生,而且我对某些东西有点失落。内存映射文件 - 映射结构而不是文件?

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

但在我的情况,我创建连接方法A,一个DLL,而该DLL被赋予一个指针,该进程A已准备了C表面。我需要与Process B分享这个cSurface的数据。我真的不想调用一个空白的MMap,并将我的Process A的表面复制到它中,只是在过程B中将它复制出来。

是吗?可能映射我的表面,就好像它是一个文件一样,所以当MMap创建时它已经指向表面数据(就像我加载SomeTextFile.txt一样)?

我的计划理论上是接收一个指向Proc A表面的指针,告诉窗口与给定名称共享该表面的内存,并使用Mutexes来协调访问 - 这个想法是两个进程都读取表面同样的物理副本,不需要繁琐的复制。

这可能吗?

+0

只是想我会让我的帖子更清晰一点。假设我有一个名为'char buffer [SUPER_MASSIVE]'的巨大缓冲区和一个名为'hSuperMassiveFile'的巨大文件。我可以通过'CreateFileMapping(hSuperMassiveFile,...)'来分享SuperMassiveFile,但是我想对我的缓冲区做同样的事情。有没有办法做'CreateFileMapping((HANDLE)缓冲区,...)'而不是共享我的缓冲区,而不需要请求一个空映射,然后'CopyMemory()'我的缓冲区到它呢? – 2012-01-12 14:25:09

回答

1

感谢您的所有意见的文档。

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

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

2

是的,这一切都没有的CreateFileMapping的文档。

你可以给你的内存映射文件的名称。如果另一个进程打开一个具有相同名称的mmap,它将指向相同的内存。它在CreateFileMapping中的句柄被置于INVALID_HANDLE_VALUE,它保持纯粹在内存中。检查的CreateFileMapping

+0

我知道的很多,我的问题是让MMap开始包含我的数据。如果我的数据在_file_中,并且我做了'CreateFileMapping(hMyFile,...);'那么地图会自动包含MyFile的内容。但是我的数据在内存中,而且非常庞大。如果我做'CreateFileMapping(INVALID_HANDLE_VALUE,...);'然后我回到一个指向未初始化荒地的指针,然后我需要复制大量缓冲区,花费时间。我更喜欢它,如果有一种方法可以使Map从制作的那一刻开始指向我的缓冲区。 – 2012-01-12 14:18:28

+0

我正在创建一个DLL,并且由父应用程序创建缓冲区。父级给我指向缓冲区的指针及其大小作为函数中的参数。所以从我看到的情况来看,我的选择是将缓冲区复制到MMapped区域,或者以某种方式映射缓冲区已存在的区域。 – 2012-01-12 14:39:26