【问题标题】:Unable to load Firebird client library on Windows 10无法在 Windows 10 上加载 Firebird 客户端库
【发布时间】:2018-06-25 13:38:11
【问题描述】:

两天前,我安装了 Windows 10 build 1709 16299.192 和 Embarcadero Delphi 10.2.2 Tokyo。

由于我安装了它们,我的应用程序无法在运行时加载 Firebird 客户端库。

如果我有一个使用旧版 Windows 和 Delphi 10.2.2 编译的 exe 文件,它可以正常工作,但使用新 Windows 和 Delphi 编译的每个 exe 文件都无法正常工作。

如果我通过TFDConnection 测试连接,它会成功连接,但是当我运行应用程序时出现此错误:

[firedac][phys][fb]-314 无法加载供应商库 [c:\users\username\desktop\projectname\bin\fbclient.dll] 找不到指定的模块
提示:检查它是否在 PATH 或应用程序 EXE 目录中,并且具有 x86 位。

路径正确,客户端库是x86的。在安装 Windows 10 build 1907 16299.192 之前,相同的应用程序正在运行。

我试过DevArt UniDac,编译成Win64,还是一样的问题。

重新安装 Windows 和 Delphi 10.2.2(使用 25.0.28979.1978 和 25.0.29039.2004 两个版本进行测试)仍然没有帮助。

我认为这是一个权限问题,但我不知道如何解决它。我给了bds.exe所有组的所有权限,但仍然无法正常工作。

我的测试应用程序中只有此代码

procedure TForm1.FormCreate(Sender: TObject);
var
  Path: string;
begin
  Path := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
  FDPhysFBDriverLink1.VendorHome := Path;
  FDPhysFBDriverLink1.VendorLib := 'fbclient.dll';
  FDConnection1.Params.Database := Path + 'FBDV3.0.FDB';
  FDConnection1.DriverName := 'FB';
  FDConnection1.Params.UserName := 'sysdba';
  FDConnection1.Params.Password := 'masterke';
  FDConnection1.LoginPrompt := False;
  FDConnection1.Connected := True;
end;

bin 文件夹中包含的文件和文件夹:

插件(文件夹包含 engine12.dll)
fbclient.dll
ib_util.dll
icudt52.dll
icudt52l.dat
icuuc52.dll

【问题讨论】:

  • 这不是权限问题。该错误意味着找不到所需的 DLL。而且由于您明确告诉TFDConnection fbclient.dll 的位置,fbclient.dll 本身很可能依赖于搜索路径中缺少的另一个 DLL。使用 SysInternals Process Monitor 查看实际正在查找哪些文件,以及正在搜索它们的位置。
  • 不要将VendorHome设置为VendorLibfully qualified library file name
  • @Martin 密码正确 Firebird 密码只有 8 个字母,所以即使你写了 'Y' 也会被忽略。
  • FDPhysFBDriverLink behaving weirdly with VendorLib Path 的可能重复项:“驱动程序不断将“\bin\”添加到我的 VendorHome 路径的末尾”,因此可能正在寻找其他 DLL在c:\users\username\desktop\projectname\bin\bin 中,而不是在c:\users\username\desktop\projectname\bin 中。这将解释错误。 Process Monitor 将以一种或另一种方式验证/拒绝该方法。就像维多利亚说的,只需删除VendorHome 分配
  • 不要将任何内容复制到 system32 中,也不要修改程序文件的安全设置。停止随意尝试可能会损坏您的机器的疯狂东西。在尝试解决问题之前先诊断问题。

标签: delphi dll windows-10 firebird client-library


【解决方案1】:

我只需要安装Microsoft Visual C++ 2010 Redistributable

我花了几个小时尝试和尝试很多事情,我找不到任何导致它的线索,即使通过深入调试 FD 源代码(Delphi 10.4.2)也是如此。太糟糕了,任何地方都没有有用的错误消息。但后来我使用了SysInternals Process Explorer,发现了这个依赖。感谢@Remy。 (在我的情况下,仅复制 msvcr100.dll 并没有帮助。)

当然,我不能说这是否会对这里有所帮助,但至少它可以帮助许多其他人。症状是一样的 - 它在 IDE(数据资源管理器)中工作,但在编译的应用程序中不起作用,即使 dll 在那里。

通过调试,我还验证了错误消息不仅要求 fbclient.dll,而且要求 fbembed.dll,这不是任何错误参数的标志:如果第一个无法加载,它总是在寻找第二个(不仅是在没有找到的情况下)。

【讨论】:

  • 所需的 Microsoft Visual C++ Redistributable 取决于 Firebird 版本,而 SysInternals Process Monitor 可能是跟踪文件访问的更好工具。感谢您让我走上正轨。
猜你喜欢
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 2018-04-17
  • 2020-06-24
  • 2019-04-17
相关资源
最近更新 更多