如果加载DLL无法找到依赖项,有没有办法捕获错误?

时间:2017-06-13 10:09:23

标签: delphi winapi delphi-2007

我正在编写一个Windows 32位程序,可以使用多个可能的dll之一。因此它尝试使用SysUtils.SafeLoadLibrary依次加载每个dll,如果加载成功,则使用该dll。

不幸的是,其中一些dll与其他dll静态链接。这些dll可能在计算机中丢失。在那种情况下,我得到对话告诉我

  

[myprogram]:[myprogram.exe]系统错误

     

程序无法启动,因为您的计算机缺少[某些dll名称]。尝试重新安装程序以解决此问题。"

按下该对话框上的OK按钮后,程序会获取错误代码并尝试其他一个dll然后正常工作。

不是向用户显示该对话框,而是希望我的程序默默地忽略它。

我该如何实现?

如果重要:我的程序是用Delphi 2007编写的.Windows版本是Windows 8.1,但该程序也适用于其他Windows版本> = Windows XP。

我尝试SetErrorMode(SEM_FAILCRITICALERRORS),但没有任何区别。

1 个答案:

答案 0 :(得分:3)

SafeLoadLibrary将错误模式设置为您作为参数提供的值,然后在调用LoadLibrary后返回它。很可能您没有为该参数提供值,在这种情况下会传递默认值SEM_NOOPENFILEERRORBOX。在这种情况下,可能会禁用SEM_FAILCRITICALERRORS来解释您看到的行为。

您可以在每次致电SEM_FAILCRITICALERRORS时传递SafeLoadLibrary来解决问题。或者,也许更好的方法是通过当前的错误模式。然而,这很难获得。在Vista及更高版本中,您可以拨打GetErrorMode。但在旧版本中,你必须这样做:

ErrorMode := SetErrorMode(0);
SetErrorMode(ErrorMode);

因为这是一个进程范围的设置,所以在两个SetErrorMode调用之间有一个机会窗口,可以捕获多线程应用程序。

坦率地说,我相信你应该在一个进程的生命周期中,在启动时只调用一次SetErrorMode。考虑到这一点,我会回避SafeLoadLibrary

如果你想利用它的其他功能,即防止改变浮点控制状态,那么你应该自己实现这个功能。