【问题标题】:How to delete openssl dlls before closing the application如何在关闭应用程序之前删除 openssl dll
【发布时间】:2011-05-05 02:28:50
【问题描述】:

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

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

所有的 indy 组件都在我在关闭应用程序之前销毁的数据模块中。

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

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

我尝试制作一个简单的 exe,只删除 2 个 dll 并且它可以工作。所以问题是2个dll被锁定了,直到LogAndMailApplication没有关闭,如何解决这个问题?

【问题讨论】:

  • 如果 DLL 隐藏在可执行文件中,如果用户或管理员需要关键的安全补丁,他们如何用更新的版本替换 DLL?
  • 他们不能,但这在这里没有意义。我只是给自己发一封电子邮件。我只在 3 个客户上安装它,所以现在它是可以管理的。
  • 为什么需要删除 DLL?为什么不将它们保存在应用程序目录中,以便下次使用? (就此而言,你为什么不让安装程序把它们放在那里?)
  • 如果您的应用程序将 dll 提取到应用程序文件夹中,则需要在启用 UAC(默认)的 vista 或更新的窗口上以提升的权限运行。正如 Rob 建议的那样,安装程序应该把它们放在那里。
  • 好的。这只是一个快速而肮脏的工具,我不需要安装程序。

标签: delphi openssl indy


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    FreeLibrary(GetModuleHandle('ssleay32.dll')); FreeLibrary(GetModuleHandle('libeay32.dll')); DeleteFile(PathToDLL1); DeleteFile(PathToDLL2);

    这应该可行。

    或者,您可以摆脱 OpenSSL 并使用我们 SecureBlackbox 中的SSL components

    【讨论】:

    • 非常感谢,您的建议奏效了(现在我如何注销 dll)。
    • 这是个坏建议。 Indy 有很多对 DLL 函数的引用,分配的对象(回调等)传入/传出 DLL 等。单独使用 FreeLibrary() 直接卸载 DLL 不允许 Indy 清理它在内部使用的任何内容。 Indy 有自己的安全卸载 DLL 的函数。你应该改用那些。请参阅我的其他答案。
    • @Remy 实际上,在关机时卸载 DLL 不会导致任何问题,除非您保留指向在关机时访问的库对象的指针。当然,调用您的方法是一个更好的解决方案。摆脱 OpenSSL 会更好。
    • 如果您直接调用 FreeLibrary(),Indy 无法知道这一点,并会尝试再次卸载 DLL。这可能会导致错误、崩溃等。由于 Indy 是加载 DLL 的人,因此 Indy 应该是卸载它们的人。
    • @Remy 以及如何在无效句柄上调用 FreeLibrary 容易导致错误崩溃等? Windows 会温和地处理它。
    【解决方案3】:

    或者,您可以删除数据模块单元的最终部分中的 DLL...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多