【问题标题】:How to show Windows' "DLL not found" error in my program in C++?如何在我的 C++ 程序中显示 Windows 的“找不到 DLL”错误?
【发布时间】:2017-05-04 10:09:01
【问题描述】:

我已经在这个网站上搜索了我要找的东西;但我不明白。

所以,我写了这个问题。

我用 C++(代码块 IDE)编写了一个 .dll 文件和一个程序。如果dll文件和程序在同一个目录下,我的程序就可以运行了。

但是如果我删除 dll 文件并执行我的程序,Windows 会显示这个错误:

“xxx.exe 已停止工作。”

我想“程序无法启动,因为您的计算机中缺少 xxx.dll。”消息而不是这个。

我该怎么办?

【问题讨论】:

  • 您可能需要在 application manifest 中将该 .dll 指定为依赖项。
  • 你为什么要这个?普通用户无权更改 `\Program Files\YourApp` 中的文件,并且应该信任管理员不会破坏程序。如果他们仍然这样做,他们应该了解他们的行为的后果。
  • @MSalters 用户会做各种各样的事情,包括“删除所有那些不必要的文件”。这很愚蠢,当然,但这并不意味着它不会发生。为什么您认为它与具有称职管理员的系统有关?
  • @Aziuth:因为 Windows 甚至不会让非管理员进入C:\Program Files\ !它被隐藏保护。他们甚至没有目录的列出权限,更不用说删除权限。至于拥有管理员密码的白痴,他们可以通过多种方式破坏您的系统,您甚至无法有效处理其中的一小部分。仅举几个愚蠢的想法:重命名\Program Files\ 或其中的子目录,更改访问权限,随机更改注册表。不要让他们的行为成为你的问题,那是没有希望的。

标签: c++ dll error-handling throw


【解决方案1】:

您可以进行三种链接。

  • 加载时链接是在程序启动时自动加载 DLL。 Windows 通常会在与可执行文件相同的文件夹中找到此 DLL。
  • 运行时链接是指通过在代码中调用 LoadLibrary 来专门加载 DLL。

当应用程序调用 LoadLibrary 或 LoadLibraryEx 函数时,系统会尝试定位 DLL(有关详细信息,请参阅动态链接库搜索顺序)。如果搜索成功,系统会将 DLL 模块映射到进程的虚拟地址空间并增加引用计数。如果对 LoadLibrary 或 LoadLibraryEx 的调用指定了一个 DLL,其代码已映射到调用进程的虚拟地址空间,则该函数只返回 DLL 的句柄并增加 DLL 引用计数。 ~taken from here

您想要做的是运行时链接到您的 dll 并测试结果,而不是您当前正在做的事情。

  • Visual Studio 提供第三种选择,延迟加载的 DLL。~ MSalters

它会为您处理 loadLibrary 调用。

【讨论】:

  • Visual Studio 提供了第三种选择,即延迟加载的 DLL。但不是 CodeBlocks/MinGW 的选项。
  • 感谢您提供的信息!作为一个 MinGW 用户,我不知道这个功能的存在。将编辑答案以考虑您的评论。
猜你喜欢
  • 2021-07-01
  • 2013-03-08
  • 2010-11-30
  • 1970-01-01
  • 2023-03-20
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多