2015-07-10 18 views
0

我正在使用SysUtils.LoadPackage函数来加载动态包。 有时,它可能发生,有些包不同步,出现这样的错误(从互联网上采取图片):如何避免针对SysUtils.LoadPackage函数引发的“无法在动态链接库中找到过程入口点”消息

enter image description here

在这种情况下,我想管理例外避免错误对话框。 不幸的是,我注意到消息显示在LoadPackage过程中。 是否有解决方法或其他功能不会引发错误对话框?

+0

这可能是因为你没有安装正确的运行时库而发生的。这是你需要解决的问题。 –

+0

@DavidHeffernan:我知道,但我们有数百个已安装的应用程序,并且包不会由我交付给客户。所以,它可以发生,独立于我所做的事情。 – ExDev

+0

在您的程序中尝试处理此问题是错误的。提供一个体面的安装程序,安装所有的依赖项。确保你可以控制交付的东西。如果用户拧紧安装,他们会收到一条错误消息,并且必须重新安装。你怎么能希望从一个破碎的依赖恢复? –

回答

2

您可以禁止由系统而不是Delphi引发的此对话框。

首先,您需要设置过程错误模式来抑制您在问题中显示的Windows对话框。这样做,在程序启动时调用这个函数:

procedure SetProcessErrorMode; 
var 
    Mode: DWORD; 
begin 
    Mode := SetErrorMode(SEM_FAILCRITICALERRORS); 
    SetErrorMode(Mode or SEM_FAILCRITICALERRORS); 
end; 

错误模式默认显示与古代版本的Windows的向后兼容性的原因严重错误对话框。 Microsoft say

最佳做法是,所有的应用程序调用进程范围SetErrorMode功能在启动时SEM_FAILCRITICALERRORS的参数。这是为了防止错误模式对话框挂起应用程序。

上面的代码确实如此。并抑制问题中显示的对话框。

然后,当您拨打LoadPackage时,您需要捕获EPackageError异常,并提出并处理它们(无论您选择了哪些)。这些EPackageError异常是Delphi运行时的告诉你,LoadPackage的调用失败的方式。

在行之间读取,我猜你已经处理了这些异常,并且错误模式设置就是你需要做的。

+0

它似乎不适用于我的情况。我在FormCreate中执行SetProcessErrorMode,但仍然出现错误对话框。表单本身就是一个动态包(主包加载其他动态包)。这可能会使SetProcessErrorMode无法正常工作? – ExDev

+0

您可以轻松创建一个示例来显示根据错误模式显示此对话框。我不知道你的程序在做什么。请建立一个简单的项目来说服错误模式如何影响显示此对话框的系统。当然,也许错误模式设置得太晚了。正如我所说,设置它的正确位置是在应用程序启动时。在宿主exe文件的初始化部分中进行加载,该加载非常早。 –

+0

再读一次。我想知道你是否试图在未能加载的软件包中设置错误模式。显然,这将无济于事。在初始化的第一个单元的初始化部分,将主机exe中的主机exe只设置一次。 –

相关问题