加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:11:38 所属栏目:大数据 来源:网络整理
导读:我正在编写一个 Windows 32位程序,可以使用多个可能的dll之一.所以它尝试使用SysUtils.SafeLoadLibrary依次加载每个dll,如果加载成功,则使用该dll. 不幸的是,其中一些dll与其他dll静态相关.这些dll可能在计算机中丢失.在那种情况下,我得到对话告诉我 [myprog
我正在编写一个 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.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读