我正在编写一个Windows 32位程序,可以使用多个可能的dll之一。因此,它尝试依次使用加载每个dll SysUtils.SafeLoadLibrary
,如果加载成功,它将使用该dll。
不幸的是,这些dll中的某些是静态链接到其他dll的。这些dll可能会从计算机中丢失。在这种情况下,我会看到对话框告诉我
[myprogram]:[myprogram.exe]系统错误
该程序无法启动,因为您的计算机缺少[某些dll名称]。请尝试重新安装该程序以解决此问题。”
在该对话框上按“确定”按钮后,程序获取错误代码并尝试使用其他dll之一,然后运行正常。
而不是向用户显示该对话框,我希望我的程序默默地忽略它。
我该怎么做?
在某些情况下:我的程序是用Delphi 2007编写的。Windows版本是Windows 8.1,但是该程序也应与其他Windows版本(=> Windows XP)一起使用。
我已经尝试过了,SetErrorMode(SEM_FAILCRITICALERRORS)
但是没有任何区别。
SafeLoadLibrary
将错误模式设置为您提供的参数值,然后在调用return之后将其LoadLibrary
恢复。很可能您没有为该参数提供值,在这种情况下,SEM_NOOPENFILEERRORBOX
将传递默认值。在这种情况下,可能会禁用SEM_FAILCRITICALERRORS
它来解释您看到的行为。
您可以在SEM_FAILCRITICALERRORS
每次致电时通过传递来解决问题SafeLoadLibrary
。或者,也许更好的方法是通过当前的错误模式。但是,这很难获得。在Vista及更高版本中,您可以致电GetErrorMode
。但是在旧版本中,您必须这样做:
ErrorMode := SetErrorMode(0);
SetErrorMode(ErrorMode);
由于这是一个过程范围的设置,因此在两次调用之间有一个机会窗口,SetErrorMode
可以抓住多线程应用程序。
坦白地说,我认为您应该SetErrorMode
在启动过程中的整个生命周期中仅调用一次。考虑到这一点,我会避开SafeLoadLibrary
。
如果您想利用它的其他功能,即防止浮点控制状态发生变化,那么我认为您应该自己实现该功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句