delphi – 如果加载DLL无法找到依赖项,有没有办法捕获错误?
我正在编写一个
Windows 32位程序,可以使用多个可能的dll之一.所以它尝试使用SysUtils.SafeLoadLibrary依次加载每个dll,如果加载成功,则使用该dll.
不幸的是,其中一些dll与其他dll静态相关.这些dll可能在计算机中丢失.在那种情况下,我得到对话告诉我
按下该对话框上的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. 如果你想利用它的其他功能,即防止浮点控制状态的改变,那么你应该自己实现这个功能,在我看来. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |