3

两天前,我安装了 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

4

1 回答 1

2

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

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

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

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

于 2021-06-18T07:17:12.730 回答