gpt4 book ai didi

delphi - 如果 DLL 不存在,如何防止 'The code execution cannot proceed because xxx.dll was not found' 错误

转载 作者:行者123 更新时间:2023-12-03 15:42:50 25 4
gpt4 key购买 nike

我们在 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 文件中的第一行代码。

最佳答案

此类故障是由 statically 引起的(又名:隐式)链接 DLL。如果您选择使用静态链接,则没有任何选项 - DLL必须存在于尝试运行应用程序的系统上。

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

一是重写受影响的代码部分以使用 dynamic linking (又名:显式)用于您的 DLL,而不是静态链接。对于 Delphi 6,不幸的是,这是您唯一的选择

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

 function GetSomething: Integer; external 'somelibrary.dll' delayed;

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

From Embarcadero :

The delayed directive is useful in the case where the imported routines do not exist on the target operating system on which the application is run. Statically imported routines require that the operating system find and load the library when the application is started. If the routine is not found in the loaded library, or the library does not exist, the Operating System halts the execution of the application. Using the delayed directive enables you to check, at run time, whether the Operating System supports the required APIs; only then you can call the imported routines.

Note: Trying to call a delayed routine that cannot be resolved results in a run-time error (or an exception, if the SysUtils unit is loaded).

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

关于delphi - 如果 DLL 不存在,如何防止 'The code execution cannot proceed because xxx.dll was not found' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57189256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com