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

dum*_*uch 5 delphi winapi delphi-2007

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

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

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

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

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

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

我怎么能做到这一点?

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

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

Dav*_*nan 3

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

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

ErrorMode := SetErrorMode(0);
SetErrorMode(ErrorMode);
Run Code Online (Sandbox Code Playgroud)

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

坦率地说,我认为您应该SetErrorMode在进程的生命周期中(启动时)调用一次。考虑到这一点,我会避开SafeLoadLibrary

如果您希望利用它的其他功能,即防止浮点控制状态发生更改,那么我认为您应该自己实现该功能。