如果 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对象检查器?

    继我最近发布的这个问题之后 组件编辑器可以在多个组件上执行吗 https stackoverflow com questions 14802371 can a component editor be executed on multiple
  • MSBuild 命令行 - 添加 dll 引用

    我使用 makefile 来编译我的 C 项目 在这个makefile中 我创建了一个库tools dll 调用csc exe OK 现在 我想在我的项目中使用这个 dll 由于某些原因 我必须使用使用 csproj 文件的 MSBuild
  • 如何在Electron App中调用C# dll方法?

    我有一个电子应用程序 可以从读卡器读取信用卡详细信息 他们提供了一个 c dll 来与应用程序交互 我不知道如何从电子应用程序读取 dll 方法 首先使用以下命令检查 dll 中公开的函数依赖步行者 http www dependencyw
  • 错误:使用 Microsoft WebService.dll 通过 Delphi7 规范化 XML

    我正在使用 Delphi7 修改旧项目以添加使用证书和签名 经过一番搜索后我发现XML 规范化函数 https learn microsoft com en us previous versions dd815358 v vs 85 但我无
  • 如何以编程方式安排任务

    如何使用 delphi 7 像 Google updater 一样安排任务 我没有使用注册表 因为它被卡巴斯基防病毒软件检测为误报 我在注册表中作为启动项添加的任何内容都会被检测为特洛伊木马 因此我决定使用任务计划 下面的代码展示了如何删除
  • Visual Studio 2019 能否将所需的 DLL 打包到一个小的 .exe 文件中?

    我使用 Visual Studio 2019 使用 C WinAPI 制作了一个 Windows 应用程序 完成后 我构建了它 并在我的计算机上执行 它工作完美 然后我发给我没有Visual Studio的朋友 它说需要 msvcp140d
  • 使用 xerces 链接 DLL 会给出未定义的符号

    我正在使用 cygwin 创建一个共享库 DLL 它使用 Xerces 当我从主应用程序调用 xercesc 函数时 一切都很好 但是当我尝试将一些代码放入库中时 我会得到 xerxesc 定义的所有静态内容的未定义符号 例如 std st
  • 如何在 Delphi REST 中发布内容类型为“multipart/form-data”的数据?

    我正在尝试使用 REST API 发送请求multipart form data作为内容类型 我总是收到 HTTP 1 1 500 Internal Error 作为响应 我尝试向需要的方法发送请求application x www for
  • 来自外部 DLL 的未处理的 DivideByZero 异常 - C#

    我有一个 C net 4 0 程序 其主要功能是从外部 FTP 库 项目引用的 dll 调用方法 逻辑位于 try catch 块中 catch 会打印错误 异常处理程序有一个通用参数 catch Exception ex IDE是VS 有
  • 开源 Delphi 包可使用哪些项目选项?

    我写了一些 Delphi 代码 想在 GitHub 上分享 所有代码都根据需要包含在运行时和设计时包中 每个项目有许多项目选项需要设置 输出目录 搜索路径 编译选项等 我设法找到了一些适合我的情况的默认选项 但阅读此处的其他问答很明显有多个
  • 是否有与 gcc --kill-at 等效的 Visual C++?

    也就是说 DLL 名称末尾有一个额外的 8 这会造成问题 显然 在 gcc 中使用 kill at 标志可以解决这个问题 但我找不到任何类似的 MSVC 建议 编辑 更多信息 我试图让 C JNI dll 工作 但我总是得到 线程 Thre
  • 将 struct* 从 C# 传递到 C++ dll

    C dll中的结构体定义如下 struct WAVE INFO int channel num int audio type char wave data int wave length 调用方法如下 extern C STRUCTDLL
  • Async InputQuery 不处理“取消”按钮

    我正在使用一个简单的调用TDialogServiceAsync InputQuery 使用单个输入 它只是忽略了Cancel按钮和窗口的X关闭按钮 But the Ok按钮工作正常 这是我的代码 uses FMX DialogService
  • 带位图的简单组合框

    如何将位图放入组合框中并将样式设置为简单 例如 Google Chrome 的右侧有星号 Firefox 的右侧有箭头 我尝试了这段代码 procedure TForm2 ComboBox1DrawItem Control TWinCont
  • 我如何在Delphi中处理事件?

    例如 我有一个程序 在单击 Button1 后执行某些操作 如果没有 Button1Click 中的代码 如何处理按钮的 onclick 事件 我需要为 Button1 动态添加事件 unit Unit1 interface uses Wi
  • 调试器忽略动态加载的 DLL 中的错误

    我有一个与自编码 DLL 的调试相关的非常奇怪的问题 我有一个 MFC 驱动的基于对话框的应用程序 几个静态链接的项目和几个在运行时加载的 DLL 项目 我在调试中构建解决方案 运行应用程序 然后我可以轻松调试这些 DLL 项目 现在问题来
  • TDictionary 上的 GetItem 由链接器消除

    我正在使用一个TDictionary of
  • Delphi 返回 TList 时出错

    我做了一个非常简单的应用程序 但我有一个我真的无法理解的问题 看一下这个基本代码 unit Unit1 interface uses Winapi Windows Winapi Messages System SysUtils System
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 在 Delphi 中使用 XML(将特定数据返回到变量)

    过去几天我一直在尝试使用 Delphi 2010 和 MSXML 我是一个极端的新手 需要一点指导 var MemoryStream TMemoryStream XMLPath String sName String XMLDoc vari

随机推荐