簡體   English   中英

C ++:具有內存映射文件的DLL

[英]C++: DLL with memory mapped file

我有一個可能同時被多個應用程序調用的DLL。 該DLL內存映射文件。

我有兩個問題:

1)每個應用程序都會創建自己的DLL實例,對嗎? 因此,該文件將被多次映射到內存

2)如果這是真的,我不明白這里發生了什么:

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

我不明白 有人嗎?

謝謝。

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

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

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

Edit2 :從MSDN (“備注”部分):

多個進程可以通過使用單個共享文件映射對象或創建由同一文件支持的單獨文件映射對象來共享同一文件的視圖。 通過在創建進程時繼承該句柄,復制該句柄或按名稱打開文件映射對象,多個進程可以共享一個文件映射對象。 有關更多信息,請參見CreateProcess,DuplicateHandle和OpenFileMapping函數。

[...]

文件映射對象的映射視圖維護對該對象的內部引用,並且在釋放對其的所有引用之前,文件映射對象不會關閉。 因此,要完全關閉文件映射對象,應用程序必須通過調用UnmapViewOfFile取消映射文件映射對象的所有映射視圖,並通過調用CloseHandle關閉文件映射對象句柄。 可以按任何順序調用這些功能。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM