无法在Windows 10上加载Firebird客户端库

3
两天前,我安装了Windows 10版本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版本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文件夹中包含的文件和文件夹:

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


3
这不是权限问题。该错误意味着找不到一个必需的DLL文件。由于您明确告诉TFDConnection fbclient.dll的位置,很可能fbclient.dll本身依赖于另一个在搜索路径中缺失的DLL文件。使用SysInternals Process Monitor查看实际正在寻找哪些文件以及它们正在被搜索的位置。 - Remy Lebeau
2
不要设置VendorHome,只需将VendorLib设置为完全限定的库文件名 - Victoria
3
可能是FDPhysFBDriverLink与VendorLib路径的奇怪行为的重复问题:“驱动程序始终在我的VendorHome路径结尾添加"\bin"”,因此其他DLL文件可能被寻找到 c:\users\username\desktop\projectname\bin\bin 而不是 c:\users\username\desktop\projectname\bin。这就解释了错误的原因。使用Process Monitor可以验证或否定这一点。像Victoria所说,只需删除 VendorHome 赋值即可。 - Remy Lebeau
2
不要将任何内容复制到system32中,也不要修改程序文件的安全设置。停止随意尝试可能会损坏您的计算机的疯狂操作。在尝试解决问题之前,请先诊断问题。 - David Heffernan
1
如果启用了Legacy_Auth身份验证协议,则Masterke可以正常工作,因为它将匹配“遗留”SYSDBA用户的密码,该用户仍具有旧限制。 - Mark Rotteveel
显示剩余18条评论
1个回答

2
我刚刚不得不安装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可能是更好的跟踪文件访问工具。感谢您将我引入正确的轨道。 - yonojoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接