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

前端之家收集整理的这篇文章主要介绍了delphi – 如果加载DLL无法找到依赖项,有没有办法捕获错误?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个 Windows 32位程序,可以使用多个可能的dll之一.所以它尝试使用SysUtils.SafeLoadLibrary依次加载每个dll,如果加载成功,则使用该dll.

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

[myprogram]: [myprogram.exe] System Error

The program can’t start because [some dll name] is missing from your computer. Try reinstalling the program to fix this problem.”

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

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

我怎么能做到这一点?

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

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

解决方法

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

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

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

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

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

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

猜你在找的Delphi相关文章