改善dll丢失的错误信息

问题描述:

我有一个用QT编写的程序,工作得很好。然而,它对dnssd.dll有一个间接的依赖,因为程序加载的dll使用了bonjour。如果Bonjour是没有运行该程序的机器上安装,它会说改善dll丢失的错误信息

程序无法启动,因为dnssd.dll从您的计算机 失踪。尝试重新安装程序来解决问题。

我不是通过LoadLibrary或以其他方式加载此dll。我将二进制文件与存根联系起来,所以它在int main之前自动加载。

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

我宁愿让这个错误消息为更多的信息,比如“Bonjour需要安装这个应用程序才能正常工作,请到[insert-url-here]下载它。”

有没有办法来检测一个DLL无法加载loke这个并给出一个更好的错误信息?

+2

你为什么不安装程序包中的Bonjour,或类似的东西(不可不知道你用什么样的安装程序怎么说)? –

+1

好主意。人们往往会卸载它,因为他们不知道它是什么。这也是一个麻烦,并会创建一个更复杂和脆弱的安装程序。它必须考虑Bonjour已经安装,等等。 – vidstige

+1

所以,你更喜欢更复杂和脆弱的应用程序呢?良好的安装程序框架为这些问题提供了强大的解决方案。这不是一个未解决的问题。 –

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

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

+0

所以基本上你会说没有办法检测到链接到存根的DLL无法加载? – vidstige

+1

如果你让负载自动发生,我不这么认为,但如果你只是改变链接设置,然后添加几行代码,那么是的,这是可能的。 –

+1

你实际上并不需要通过GetProcAddress或类似的东西来进行调用。您将加载只是为了检查库是否存在 - 然后像通常那样调用函数,以了解加载过程会成功 - “延迟加载”只是将由运行库完成的LoadLibrary移动到实际使用DLL时。 –