2011-09-25 127 views
3

標題幾乎說明了一切..我可以加載一個dll,使其可以在加載時被刪除嗎?

我試圖做的是寫一個工具,將監測包含插件一個DLL文件,當我覆蓋它,通過重新編譯,它會自動重新加載它。 我知道我可以製作副本,加載副本並監視原始內容,但我認爲可能有更好的方法.. 如果我理解正確的話,dll會完全加載到內存中,所以應該沒有問題刪除文件..

回答

8

不,這不是Windows的工作原理。加載DLL只會創建一個內存映射文件,除了重定位之外,實際上沒有任何內容從文件中讀取(如有必要)。直到您的代碼調用導出的函數。由於代碼尚未加載,導致頁面錯誤。現在代碼從文件讀取到RAM中。如果其他進程需要空間,那麼頁面就會被取消映射。在下一頁錯誤再次重新加載。

MMF對該文件進行硬鎖定。您只能重命名它,而不能覆蓋或刪除它。這會使程序崩潰。用FreeLibrary()釋放鎖。

+0

好吧,我不知道這個..沒關係。 – Roald

-1

還沒有嘗試過,我現在不在我的Windows機器上,但我認爲Windows加載DLL時不會寫入文件。你應該先檢查一下,你是否真的覆蓋了DLL(例如編譯一個新版本)或編譯器是否抱怨「權限被拒絕」。

否則我想你可以使用file change notification API來實現你的目標。

相關問題