3

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

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

3 回答 3

3

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

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

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

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

于 2013-04-07T05:37:21.937 回答
2

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

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

于 2013-04-07T16:42:13.010 回答
2

您可以使用 OpenSSL api 获取版本号。使用此处找到的 Marco Ferrante 的 libeay32.pas和以下函数(我修改了 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;
于 2013-09-05T13:33:21.373 回答