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

2023-12-23

我们在 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(使用前将#替换为@)

如果 DLL 不存在,如何防止“代码执行无法继续,因为找不到 xxx.dll”错误 的相关文章

  • 如何在表单上绘制半透明图像?

    我想在 Delphi 窗体上绘制半透明图像 但由于某种原因它不起作用 Here is the original PNG border is semi transparent 我将图像加载到TImage object Image1 Trans
  • Delphi - Indy - 保存 GMail 草稿

    我一直在 Delphi 下使用 Indy 通过 gmail 帐户发送消息 使用 TIdSMTP 和 TIdMessage 组件 这绝对没问题 但是 我的客户请求将消息保存到 DRAFTS 文件夹 以便他在实际发送消息之前对 以编程方式创建的
  • Delphi 的内存分析工具?

    我建立了一个项目并运行它 然后在 Process Explorer 中查看它 结果发现它在启动时使用的 RAM 比我想象的要多 5 倍 现在 如果我的程序运行得太慢 我会将其连接到分析器并让它告诉我什么正在使用我的所有周期 有没有类似的工具
  • Delphi 7 - 处理表单中嵌入框架的 MouseWheel 事件?

    你好 我有一个表格 里面有几个框架 对于某些框架 我希望滚动内容 或至少处理鼠标滚轮事件 我已经尝试过以下方法 只需为每个帧分配一个 OnMouseWheel 事件处理程序 重写父窗体的 MouseWheel 事件 procedure TF
  • TFrame继承重构

    我提出的另一个 TFrame IDE 注册组件问题 感谢各位程序员的帮助 尝试 Darrian 的 TFrame 继承建议here https stackoverflow com questions 382562 delphi visual
  • DLL 中的 GUID (.Net)

    我在这方面不是很有经验 所以我有几个问题 首先 所有 Net 创建的 DLL 是否都有自己的 GUID 如果没有 我的问题是如何获得一个并将其与 DLL 关联 那么问题是 我如何获得该 dll 的 GUID 即 给定 DLL 路径 c so
  • 为什么 TImage 旋转我的图像?

    编写一个移动应用程序 它从安全网站提取图像 如下所示 第一个图像 提取不正确 注意网络版本与移动版本 第二个图像在网站上正确显示 但 Delphi TImage 由于某种原因正在旋转它我不明白为什么 旋转设置为 0 并且在 TImage 组
  • 当调用dll函数时,参数对象的成员变量的内存地址发生变化

    类某类 一些成员MemberClass one of the mem 我有一个函数foo SomeClass object 在 dll 中 它是从 exe 调用的 Problem 地址one of the mem 在调度 dll 调用期间发
  • 以编程方式确定是否安装了 COM 库 (.DLL)

    C 中是否有一种编程方式来确定是否已安装特定的 COM DLL 或者这是扫描注册表中的 classId 的问题 我通常所做的 如果我再次需要的话也会这样做 是尝试创建一个您知道位于 COM 库中的类的对象实例 通过 ProgID 或 GUI
  • 应用程序处于中断模式。您的应用程序已进入中断状态,

    我发现自己遇到了同样的问题here https stackoverflow com questions 36204009 disable break mode page in vs2015 我在 dll 中使用 Windows 窗体 这是针
  • Windows 更新后 Active 设置为 False 时 TIdHttpServer 冻结

    我们有一个 Indy 版本 10 6 1 5235 TIdHttpServer 服务 多年来一直与 Delphi 2007 配合良好 在最新的 Windows 更新 KB4338815 和 KB4338830 之后 我们注意到当 TIdHt
  • 在 Delphi 中获取 TCheckbox 的总大小,包括框和文本

    我想获得 TCheckbox 的总大小 包括 Delphi 中的框和文本 我查看这篇文章Delphi FMX TCheckbox TRadiobutton 自动调整大小 https stackoverflow com questions 4
  • Delphi 应用程序被 Google Chrome 视为“危险”

    我经常用Delphi 2009制作数学软件 并将其发布在我的网站上 然而 去年左右 Google Chrome 开始认为我的一小部分 但数量不断增加 EXE 是 有害的 并且 Google Chrome 拒绝下载它们 例如 今天我编写了一个
  • 获取进程的所有 DLL

    我想获取为给定进程加载的所有 dll 的列表 我目前正在使用 NET框架4 0 我知道有一个bug https connect microsoft com VisualStudio feedback details 546430 syste
  • Soap Delphi 客户端因 1MB 调用超时而结束

    我们正在开发 SOAP Web 服务 Apache PHP 所有小规模调用都运行良好 但对于 1Mb 的 Soap 调用 HTTPS 调用大小为 1MB 我们的 Delphi Soap 客户端在除一台 PC 之外的所有 PC 上都因超时而停
  • 我有进程 ID,需要使用 Delphi 5 以编程方式关闭关联进程

    任何人都可以帮我提供一个编码示例 以便在我拥有进程 ID 时关闭关联的进程 我将使用 Delphi 5 在 Windows 2003 服务器上以编程方式执行此操作 如果您有进程 ID 并希望强制终止该进程 可以使用以下代码 function
  • Firebird 或 NexusDB

    我知道有很多与 Delphi 数据库相关的问题 但我只考虑这两个数据库 我需要查询大约 100 000 条记录 根据您的经验 哪个更快 作为嵌入式 as C S Thanks 我还没用过 Nexus tbh 但我经常使用 Firebird
  • Visual Studio 2010“找不到或打开 PDB 文件”

    我尝试在 Visual Studio 10 中调试程序 但遇到断点问题 我将与 dll 文件对应的 pdb 文件放在同一目录中 但是在检查模块时 我发现每个 DLL 文件都被签名为Cannot find or open the PDB fi
  • 依赖遍历器挂起

    当 my xll 插件加载到我的客户端 PC 上时 我遇到了问题 它在启动时使 Excel 崩溃 可能是因为缺少依赖的 dll 我知道可以在配置文件模式下使用 dependency walker 来找出 exe 运行时加载了哪些 dll 当
  • 从 C++ 调用 C++ DLL 可以,但从 C# 不行

    我有一个名为 tccdvc dll 的 DLL 它是此处提供的 SDK 的一部分 http www commell com tw Download Driver Induscial 20Peripheral Driver MPX 885 M

随机推荐