【问题标题】:Get Version and/or location of OpenSSL DLLs in Delphi?在 Delphi 中获取 OpenSSL DLL 的版本和/或位置?
【发布时间】:2013-03-29 08:40:20
【问题描述】:

出于故障排除的目的,我的应用程序是否可以在运行时进行检查:

  1. openssl dll(ssleay32.dll 和 libeay32.dll)是否真的存在并且能够被我的应用成功加载?
  2. openssl dll 的实际加载路径是什么(因此我可以验证它是从应用程序目录中的副本加载它,还是从系统路径某处获取一些杂散副本)
  3. 我的应用程序(或 Indy)使用什么版本的 openssl? (如果我知道确切的路径,大多数版本的 openssl dll 都包含我可以通过查看 Windows 文件属性检查的版本信息)

【问题讨论】:

  • 我只需在您的应用程序目录中提供库的完整路径并将它们与您的应用程序一起提供。这样一来,您唯一担心的就是发布最新版本的 OpenSSL。

标签: delphi openssl indy10


【解决方案1】:

是的。按照您要求的相同顺序:

  1. 对每个 DLL 使用 LoadLibrary 并检查返回值。
  2. 如果 #1 成功,请使用 GetModuleFileName 检索已加载 DLL 的完整路径名..
  3. 如果#2 成功,使用GetFileVersionInfo 查看 DLL 是否有可用的文件版本信息。如果是,请使用VerQueryValue 读取版本信息(与您通过查看 Windows 文件属性看到的信息相同)。

它们都可以从Windows 单元获得。 Delphi 中的所有三个示例都可以在 StackOverflow 上找到。如果您找不到它们,请在此处发布单独的问题(见下文)以寻求使用它们的帮助。

(这里的帖子应该包含一个问题,这样才能选择一个答案作为答案。如果您在同一个帖子中包含多个问题,那么几个人可以分别回答其中一个问题;在这种情况下,如何你选择接受哪一个是正确的?)

【讨论】:

    【解决方案2】:

    Indy 10 在 IdSSLOpenSSLHeaders.pas 单元中有一个 IdOpenSSLSetLibPath() 函数,因此您可以告诉 Indy DLL 的位置,而不必在操作系统搜索路径中寻找它们。

    最好的选择是在您的应用安装目录中提供所需的 DLL,这样就无需猜测您的应用将加载什么。

    【讨论】:

      【解决方案3】:

      您可以使用 OpenSSL api 获取版本号。使用 Marco Ferrante 的 libeay32.pas 找到 here 和以下函数(我修改了 Marco 的 GetVersion 示例,因为它有点不正确):

      function GetOpenSSLVersion: string;
      var
        v: cardinal;
        s: PCharacter;
      begin
        //Get the numeric release version identifier as described in http://www.openssl.org/docs/crypto/OPENSSL_VERSION_NUMBER.html#
        v := SSLeay;
      
        //Get text version number and release date, e.g.: "OpenSSL 0.9.5a 1 Apr 2000"
        s := SSLeay_version(_SSLEAY_VERSION);
        result := s + ' (' + IntToHex(v, 9) + ')';
      end;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-18
        • 2021-02-13
        相关资源
        最近更新 更多