Delphi 如何在关闭应用程序之前删除openssl DLL

Delphi 如何在关闭应用程序之前删除openssl DLL,delphi,openssl,indy,Delphi,Openssl,Indy,我制作了一个简单的工具(LogAndMailApplication),将日志发送到我的gmail帐户,为此我使用了Indy组件TidsLioHandlerSocketOpenSSL。要工作,它需要ssleay32.dll和libeay32.dll 因此,在应用程序启动时,我从exe资源中提取2个dll,并将它们复制到应用程序文件夹中 在关闭应用程序之前,我销毁了一个数据模块中的所有indy组件 销毁数据模块后,我尝试删除DLL,但无法删除 我刚刚使用了DeleteFile,但对于我在应用程序退出

我制作了一个简单的工具(LogAndMailApplication),将日志发送到我的gmail帐户,为此我使用了Indy组件TidsLioHandlerSocketOpenSSL。要工作,它需要ssleay32.dll和libeay32.dll

因此,在应用程序启动时,我从exe资源中提取2个dll,并将它们复制到应用程序文件夹中

在关闭应用程序之前,我销毁了一个数据模块中的所有indy组件

销毁数据模块后,我尝试删除DLL,但无法删除

我刚刚使用了DeleteFile,但对于我在应用程序退出时删除的所有其他文件(包括ini文件),这都非常有效


我试图制作一个简单的exe,只删除2个dll,它就可以工作了。所以问题是,在LogAndMailApplication未关闭之前,2 dll以某种方式被锁定,如何解决此问题?

您可以执行以下操作:在代码使用的最后

FreeLibrary(GetModuleHandle('ssleay32.dll'); FreeLibrary(GetModuleHandle('libeay32.dll'); 删除文件(路径todell1); 删除文件(路径todell2)

这应该行得通


或者,您可以摆脱OpenSSL并从我们的SecureBackbox中使用。

Indy在运行时动态加载OpenSSL DLL,然后默认情况下在应用程序关闭之前不会卸载它们。如果希望更快地卸载DLL,则需要直接调用
idsslopensssl.UnLoadOpenSSLLibrary()
。这将卸载DLL并清理与之相关的所有引用和分配对象。

或者,您可以删除数据模块单元的“终结”部分中的DLL…

如果DLL隐藏在可执行文件中,用户或管理员如何用更新版本替换DLL,如果他们需要一个关键的安全补丁?他们不能,但这在这里是没有意义的。我只是在给自己发一封电子邮件。我只在3个客户上安装这个,所以现在它是可管理的。为什么你需要删除DLL呢?为什么不把它们保存在应用程序目录中,以便下次使用呢?(就此而言,为什么不让安装程序将它们放在那里?)如果应用程序将dll提取到应用程序文件夹中,则需要在vista或启用UAC的较新windows上以提升的权限运行(默认设置)。正如Rob所建议的,安装人员应该把它们放在那里。这只是一个快速和肮脏的工具,我不需要安装程序。非常感谢,你的建议奏效了(现在我知道如何注销DLL)。这是一个糟糕的建议。Indy对DLL函数、传入/传出DLL的已分配对象(回调等)有大量引用。仅使用FreeLibrary()直接卸载DLL不允许Indy清除其内部使用的任何内容。Indy有自己的安全卸载DLL的功能。你应该用那些来代替。请参阅我的另一个答案。@Remy事实上,在关机时卸载DLL不会导致任何问题,除非您保留指向关机时访问的库对象的指针。当然,调用您的方法是更好的解决方案。如果你直接调用FreeLibrary(),Indy无法知道这一点,并且会再次尝试卸载DLL。这可能会导致错误、崩溃等。由于Indy是加载DLL的人,因此Indy应该是卸载DLL的人。@Remy以及如何在无效句柄上调用FreeLibrary容易发生错误、崩溃等。?Windows将温和地处理它。