我们在 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 文件中的第一行代码。
此类故障的原因是静态地 http://docwiki.embarcadero.com/RADStudio/Rio/en/Libraries_and_Packages_(Delphi)#Static_Loading (aka : 隐含地) 链接 DLL。如果您选择使用静态链接 - DLL,则没有选项must出现在尝试运行应用程序的系统上。
有两种方法可以允许 DLL 选择性地存在。
一是重写受影响的代码部分以使用动态链接 http://docwiki.embarcadero.com/RADStudio/Rio/en/Libraries_and_Packages_(Delphi)#Dynamic_Loading (aka : explicit) 用于您的 DLL,而不是静态链接。对于 Delphi 6,不幸的是这是你的唯一的选择.
如果您仅针对 Windows,则可以使用另一个选项and如果您使用 Delphi 2010 或更高版本进行编译,则可以通过使用延迟加载来装饰您的导入声明delayed
指示:
function GetSomething: Integer; external 'somelibrary.dll' delayed;
这实际上只是动态加载之上的语法糖,但它确实提供了一种将静态链接代码迁移到动态链接模型的更简单路径,而无需进行大量重写。
从内河码头 http://docwiki.embarcadero.com/RADStudio/Rio/en/Libraries_and_Packages_(Delphi)#Delayed_Loading_.28Windows-only.29 :
当运行应用程序的目标操作系统上不存在导入的例程时,延迟指令非常有用。静态导入例程要求操作系统在应用程序启动时查找并加载该库。如果在加载的库中找不到该例程,或者该库不存在,操作系统将停止应用程序的执行。使用延迟指令可以让您在运行时检查操作系统是否支持所需的 API;只有这样你才能调用导入的例程。
注意:尝试调用无法解析的延迟例程会导致运行时错误(如果加载了 SysUtils 单元,则会导致异常)。
无论是延迟加载还是动态加载,您都需要捕获解析 DLL 的失败,并优雅地拒绝用户访问 DLL 提供的任何函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)