【问题标题】:Improving the dll missing error message改进 dll 丢失错误信息
【发布时间】:2011-10-12 12:40:12
【问题描述】:

我有一个用 QT 编写的程序,运行良好。然而,它间接依赖于 dnssd.dll,因为程序加载的 dll 使用 bonjour。如果运行程序的机器上没有安装 bonjour,它会说

程序无法启动,因为您的文件中缺少 dnssd.dll 电脑。尝试重新安装程序以解决问题。

我没有通过LoadLibrary 或其他方式加载此dll。我将二进制文件与存根链接,因此它会在 int main 之前自动加载。

显然重新安装程序并不能解决问题。对我来说,它清楚地表明我需要安装 bonjour,但对于大多数用户来说,这非常神秘。

我希望此错误消息包含更多信息,例如“需要安装 Bonjour 才能使此应用程序正常工作,请转到 [insert-url-here] 下载它。”

有没有办法检测 dll 何时加载失败并给出更好的错误消息?

【问题讨论】:

  • 为什么不将 Bonjour 打包到安装程序中(如果不知道您使用的是哪种安装程序就无法说明如何),或者类似的东西?
  • 好主意。人们倾向于卸载它,因为他们不知道它是什么。这也很麻烦,并且会创建一个更复杂和脆弱的安装程序。必须知道 bonjour 已经安装,等等。
  • 那么,您更喜欢更复杂、更脆弱的应用程序吗?好的安装程序框架为大多数这些问题提供了强大的解决方案。这不是一个未解决的问题。
  • @R.MartinhoFernandes 是的,我愿意。我对安装程序的经验是使其尽可能简单。安装程序很难测试,基本上应该只是将文件复制到一个文件夹中。这几乎就是 Android 和 Windows 8 商店的做法,并且安装几乎从不失败。我们在 Windows 桌面世界中可以从中学到很多东西。

标签: c++ qt dll bonjour


【解决方案1】:

将其设置为延迟加载,然后尽早(在导致加载发生之前)尝试自己加载(使用 LoadLibrary)并报告问题。

http://msdn.microsoft.com/en-us/library/151kt790.aspx

【讨论】:

  • 所以基本上你是说没有办法检测到链接到存根的 dll 何时加载失败?
  • 如果你让加载自动发生,我不这么认为,但如果你只是改变一个链接设置,然后添加几行代码,那么是的,这是可能的。
  • 您实际上不需要通过 GetProcAddress 或类似的方式进行调用。您将加载只是为了检查库是否存在——然后像往常一样调用函数,知道加载过程会成功——延迟加载只是将运行时完成的 LoadLibrary 移动到实际使用 DLL 时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多