2012-01-12 173 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