2013-09-25 33 views
1

我有一個DLL可能會被多個應用程序同時調用。 此DLL內存 - 映射文件。C++:帶內存映射文件的DLL

我有2個問題:

1)每個應用程序會創建自己的DLL的實例,對不對? 就這樣,該文件將內存映射多次

2)如果這是真的,我不知道這裏發生了什麼:

一)申請A調用該DLL。 b)應用程序B調用DLL。 c)我退出應用程序A,並且該DLL將取消映射該文件。 d)應用程序B調用DLL,並且內存映射文件不再可用,並且調用失敗。

我不明白這一點。 有人嗎?

謝謝。

回答

3

發生這種情況是因爲您從1)中的假設是錯誤的。一個dll根據定義共享;這兩個應用程序都使用相同的dll實例,因此當您在一個應用程序中釋放該文件時,其他人將無法使用該文件。

要解決您的問題,您應該實施一些引用計數機制,以便僅在沒有進程正在使用該文件時取消映射該文件。

編輯:@sumeet是正確的。每個進程都有自己的地址空間;當兩個進程加載相同的dll時,他們可能會共享其只讀數據以提高效率,但其可寫數據對每個進程都是本地的。儘管如此,內存映射文件是一個內核對象,如信號量,管道和共享內存。因此,如果你在一個進程中取消映射,你可以全部取消映射。

EDIT2:從MSDN(備註部分):

多個進程可以通過使用 單個共享文件映射對象或創建單獨的文件映射由備份 對象共享同一文件的視圖同一個文件。通過繼承進程 創建,複製句柄或打開文件映射對象 的名稱,單個文件映射對象可以是由多個進程共享的 。有關更多信息,請參見CreateProcess,DuplicateHandle 和OpenFileMapping函數。

[...]

映射文件映射對象的視圖保持內部的引用 的對象,直到所有 對它的引用被釋放文件映射對象不會關閉。因此,要完全關閉映射對象文件 ,應用程序必須通過調用UnmapViewOfFile來取消映射文件 映射對象的所有映射視圖,並通過調用CloseHandle來關閉文件映射 對象句柄。這些功能可以以任何順序在 中調用。

首先,從第一段開始,每個應用程序如何初始化視圖? 從第二段我收集到,從每個應用程序調用UnmapViewofFileCloseHandle將釋放對內存文件的所有引用,然後Windows將自動釋放相關資源(即他保留引用計數,您不需要執行此操作)。 爲兩個應用程序發佈你的內存映射初始化和關閉代碼。

+0

我沒有downvote它。不知道爲什麼這是downvoted。你能告訴我一個參考櫃檯的樣品嗎? – tmighty

+0

我不認爲你的答案是正確的。使用該Dll的每個進程都將擁有自己的全局變量和靜態變量副本。 – sumeet

+0

@sumeet:你說得對。我在編輯中澄清了這一點。 –