You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi Seattle中32/64位程序适配同名libeay32/ssleay32.dll方案咨询

解决32/64位Delphi程序调用对应位数OpenSSL DLL的问题

方案1:手动指定路径加载(推荐)

Windows加载DLL时默认优先搜索程序当前目录,但你可以在程序启动阶段手动加载对应位数的DLL,绕开自动加载的冲突问题:

  • 把32位的libeay32.dll和ssleay32.dll放在程序根目录的Win32子文件夹,64位DLL放在Win64子文件夹
  • 在Delphi代码中先判断当前进程位数,再构造对应路径加载DLL,示例代码:
function Is64BitProcess: Boolean;
begin
  Result := SizeOf(Pointer) = 8;
end;

procedure LoadOpenSSLDLLs;
var
  DLLDir: string;
begin
  if Is64BitProcess then
    DLLDir := ExtractFilePath(ParamStr(0)) + 'Win64\'
  else
    DLLDir := ExtractFilePath(ParamStr(0)) + 'Win32\';

  // 加载两个DLL,后续API调用会自动关联已加载的实例
  LoadLibrary(PChar(DLLDir + 'libeay32.dll'));
  LoadLibrary(PChar(DLLDir + 'ssleay32.dll'));
end;
  • 注意:如果你的MS Graph API封装是静态链接DLL(比如通过导入单元),要确保在程序初始化最早期调用上述加载代码,或者改成动态通过GetProcAddress获取API函数。

方案2:利用Side-by-Side(SxS)部署

通过应用程序清单文件,为不同位数的EXE指定对应的DLL路径,无需修改代码:

  • 为32位EXE编写清单,声明依赖的DLL位于Win32子目录
  • 为64位EXE编写清单,声明依赖的DLL位于Win64子目录
  • 这种方式依赖Windows的SxS机制,适合不想改动业务代码的场景。

方案3:重命名64位DLL(妥协方案)

虽然你原本不希望64位DLL带32后缀,但可以将64位版本重命名为libeay64.dll和ssleay64.dll,然后在代码中根据进程位数选择加载对应的文件名:

  • 优点:所有文件可放在根目录,无需子文件夹
  • 缺点:需要修改DLL导入相关的代码(静态导入需替换单元中的DLL名称,动态加载需调整文件名判断逻辑)

补充说明

64位OpenSSL DLL仍使用xxx32.dll命名是历史遗留问题,部分分发版本会保留这个命名。你也可以自行编译OpenSSL时修改输出文件名,或下载带有64后缀的第三方分发版本,从根源避免文件名冲突。

内容的提问来源于stack exchange,提问作者AFerns100

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:10:26