gpt4 book ai didi

delphi - 如果加载 dll 找不到依赖项,有什么方法可以捕获错误吗?

转载 作者:行者123 更新时间:2023-12-03 15:12:44 24 4
gpt4 key购买 nike

我正在编写一个 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."

按下该对话框上的“确定”按钮后,程序会获取错误代码并尝试其他 dll 之一,然后该 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 - 如果加载 dll 找不到依赖项,有什么方法可以捕获错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44518449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com