在Delphi中获取OpenSSL DLL的版本和/或位置?

时间:2013-04-07 05:29:37

标签: delphi openssl indy10

出于疑难解答的目的,我的应用程序可以在运行时检查是否有实用的方法:

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

3 个答案:

答案 0 :(得分:3)

是。按照你要求的顺序:

  1. 对每个DLL使用LoadLibrary并检查返回值。
  2. 如果#1成功,请使用GetModuleFileName检索已加载的DLL的完整路径名。
  3. 如果#2成功,请使用GetFileVersionInfo查看DLL是否有可用的文件版本信息。如果是,请使用VerQueryValue读取版本信息(通过查看Windows文件属性看到的相同信息)。
  4. 它们全部来自Windows单元。 Delphi中的所有三个示例都应该在StackOverflow中找到。如果您找不到它们,请在此处发布单独的问题(请参阅下文)以寻求帮助。

    (这里的帖子应该包含一个问题,因此可以选择一个答案作为答案。如果你在同一篇文章中包含多个问题,几个人可以分别回答其中一个;在这种情况下,怎么办?你选择哪一个接受正确?)

答案 1 :(得分:2)

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

最好的选择是在应用程序的安装目录中发送所需的DLL,然后无需猜测即可知道应用程序将加载的内容。

答案 2 :(得分:2)

您可以使用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;