如果不存在DLL,如何防止“由于找不到xxx.dll而无法继续执行代码”错误

Joh*_*han 3 delphi dll

我们已经在Delphi 10中开发了一个DLL,可在某些旧版Delphi 6应用程序中使用它。DLL中的新功能仅适用于少数几个客户端,因此不需要推广到我们的所有客户端。如果我们尝试在没有DLL的情况下部署Delphi 6应用程序,则会出现错误“由于找不到xxx.dll,所以无法继续执行代码”。应用开始运行时,我们会收到错误消息。如果DLL不存在,是否有办法防止此错误?在我们的Delphi 6代码中,我们已经使用FileExists(xxx.dll)来查看是否应该使DLL中的功能可用,因此,如果没有dll,我们就不会冒应用程序崩溃的风险。

我们也很想知道Delphi 6应用检查DLL的位置/时间,因为它发生在Application.Initialize之前,它是DPR文件中的第一行代码。

J..*_*... 9

这种类型的故障是由静态(也称为:隐式)链接DLL引起的。如果您选择使用静态链接,则没有任何选择- 尝试运行该应用程序的系统上必须存在DLL 。

有两种方法可以选择允许DLL存在。

一种是重写代码的受影响部分,以便为您的DLL 使用动态链接(也称为:explicit),而不是静态链接。不幸的是,对于Delphi 6,这是您唯一的选择

如果仅针对Windows 并且使用Delphi 2010或更高版本进行编译,则另一个选择是通过使用delayed伪指令修饰导入声明来使用延迟加载:

 function GetSomething: Integer; external 'somelibrary.dll' delayed;
Run Code Online (Sandbox Code Playgroud)

这实际上只是动态负载之上的语法糖,但是它确实为将静态链接的代码迁移到动态链接的模型提供了更简单的路径,而无需进行大量的重写。

从Embarcadero

如果导入的例程在运行该应用程序的目标操作系统上不存在,则延迟的指令很有用。静态导入的例程要求操作系统在启动应用程序时查找并加载该库。如果在已加载的库中找不到该例程,或者该库不存在,则操作系统将停止执行该应用程序。使用Delayed指令使您可以在运行时检查操作系统是否支持所需的API。只有这样,您才能调用导入的例程。

注意:尝试调用无法解决的延迟例程会导致运行时错误(如果加载了SysUtils单元,则会导致异常)。

无论是延迟加载还是动态加载,您都需要捕获无法解析DLL的失败,并优雅地拒绝用户访问DLL提供的任何功能。