2010-11-04 61 views
0

我做了一個簡單的工具(LogAndMailApplication),它將日誌發送到我的gmail帳戶,爲此我使用了Indy組件TIdSSLIOHandlerSocketOpenSSL。要運行它需要ssleay32.dll和libeay32.dll。如何在關閉應用程序之前刪除openssl dll

因此,在應用程序啓動時,我從exe資源中提取2個DLL,並將它們複製到應用程序文件夾中。

所有indy compoennts都在關閉應用程序之前銷燬的數據模塊中。

破壞datamodule後,我嘗試刪除dll,但我不能。

我剛剛使用了DeleteFile,但對於我在應用程序出口(包括一個ini文件)上刪除的所有其他文件都非常有用。

我試圖做一個簡單的exe,只是刪除2 DLL,它的工作原理。所以問題是,2 DLL將以某種方式鎖定,直到LogAndMailApplication未關閉,如何解決問題?

+0

如果DLL文件隱藏在可執行文件,怎麼能用戶或管理員可以通過一個較新的版本來替換這些DLL,如果他們需要一個關鍵的安全補丁? – mjn 2010-11-04 15:06:36

+0

他們不能,但這不是有意義的。我只是給自己發一封電子郵件。我只安裝在3位客戶上,所以目前它是可管理的。 – LaBracca 2010-11-04 15:51:41

+0

爲什麼你需要刪除DLL?爲什麼不把他們留在應用程序目錄中,以便他們下次可以使用? (對於這個問題,你爲什麼不直接讓*安裝程序把它們放在那裏?) – 2010-11-04 17:22:32

回答

3

你可以做到以下幾點:在你的代碼中使用

FreeLibrary則(的GetModuleHandle( 'ssleay32.dll'))的盡頭; FreeLibrary(GetModuleHandle('libeay32.dll')); DeleteFile(PathToDLL1); DeleteFile(PathToDLL2);

這應該工作。

或者,您可以擺脫OpenSSL並使用我們的SecureBlackbox中的SSL components

+0

非常感謝,您的建議有效(現在我現在如何取消註冊dll)。 – LaBracca 2010-11-04 15:50:15

+1

這是不好的建議。 Indy對DLL函數,傳入/傳出DLL等的分配對象(回調等)有很多引用,等等。直接使用FreeLibrary()直接卸載DLL不允許Indy清除它在內部使用的任何東西。 Indy有自己的功能來安全地卸載DLL。您應該使用這些。看到我的其他答案。 – 2010-11-04 18:55:42

+0

@Remy實際上,在關機時卸載DLL應該不會導致任何問題,除非您保留指向您在關機時訪問的庫對象的指針。當然,雖然調用你的方法是一個更好的解決方案。擺脫OpenSSL是更好的方式。 – 2010-11-04 21:02:13

5

Indy在運行時動態加載OpenSSL DLL,然後在應用程序關閉之前默認不會卸載它們。如果您想要更快地卸載DLL,則需要直接撥打IdSSLOpenSSL.UnLoadOpenSSLLibrary()。這將卸載DLL並清理與它們相關的所有引用和分配的對象。

1

或者你可以刪除DLL的數據模塊單元的定稿節...

相關問題