我制作了一个简单的工具(LogAndMailApplication),它将日志发送到我的gmail帐户,为此我使用了Indy组件TIdSSLIOHandlerSocketOpenSSL。要使用它需要ssleay32.dll和libeay32.dll。
因此,在应用程序启动时,我从exe资源中提取2 dll,然后将它们复制到应用程序文件夹中。
在关闭应用程序之前,所有indy组件都在我销毁的数据模块中。
在销毁数据模块后,我尝试删除dll,但我不能。
我刚刚使用了DeleteFile,但这对于我在应用程序退出时删除的所有其他文件(包括ini文件)非常有用。
我试图创建一个简单的exe,只删除2 dll并且它有效。所以问题是2 dll以某种方式锁定,直到LogAndMailApplication没有关闭,如何解决问题?
答案 0 :(得分:5)
Indy在运行时动态加载OpenSSL DLL,然后默认情况下在app关闭之前不会卸载它们。如果要更快卸载DLL,则需要直接调用IdSSLOpenSSL.UnLoadOpenSSLLibrary()
。这将卸载DLL并清理所有引用并分配与它们相关的对象。
答案 1 :(得分:3)
您可以执行以下操作:在代码的最后使用
FreeLibrary则(的GetModuleHandle( 'ssleay32.dll')); FreeLibrary则(的GetModuleHandle( '的libeay32.dll')); 的DeleteFile(PathToDLL1); 的DeleteFile(PathToDLL2);
这应该有效。
或者你可以摆脱OpenSSL并使用我们的SecureBlackbox中的SSL components。
答案 2 :(得分:1)
或者,您可以删除数据模块单元的最终部分中的DLL ...