Delphi 如何避免;在动态链接库中找不到程序入口点“;为SysUtils.LoadPackage函数引发的消息
我正在使用Delphi 如何避免;在动态链接库中找不到程序入口点“;为SysUtils.LoadPackage函数引发的消息,delphi,package,delphi-2007,Delphi,Package,Delphi 2007,我正在使用SysUtils.LoadPackage函数来加载动态包。 有时,可能会发生某些包未同步的情况,并出现如下错误(图片取自internet): 在这些情况下,我希望管理异常,避免出现错误对话框。 不幸的是,我注意到消息显示在LoadPackage过程中。 是否有一种变通方法或其他功能不会引发错误对话框?您可以抑制此由系统而不是Delphi引发的对话框 首先,您需要设置进程错误模式,以抑制问题中显示的Windows对话框。在程序启动时,通过调用以下函数执行此操作: procedure S
SysUtils.LoadPackage
函数来加载动态包。
有时,可能会发生某些包未同步的情况,并出现如下错误(图片取自internet):
在这些情况下,我希望管理异常,避免出现错误对话框。
不幸的是,我注意到消息显示在LoadPackage
过程中。
是否有一种变通方法或其他功能不会引发错误对话框?您可以抑制此由系统而不是Delphi引发的对话框 首先,您需要设置进程错误模式,以抑制问题中显示的Windows对话框。在程序启动时,通过调用以下函数执行此操作:
procedure SetProcessErrorMode;
var
Mode: DWORD;
begin
Mode := SetErrorMode(SEM_FAILCRITICALERRORS);
SetErrorMode(Mode or SEM_FAILCRITICALERRORS);
end;
错误模式默认为显示关键错误的对话框,原因是与旧版本的Windows向后兼容:
最佳实践是,所有应用程序在启动时都使用SEM_FAILCRITICALERRORS参数调用进程范围的SetErrorMode函数。这是为了防止错误模式对话框挂起应用程序
上面的代码正是这样做的。并取消显示问题中显示的对话框
然后,当您调用LoadPackage
时,您需要捕获引发的EPackageError
异常,并以您选择的方式处理它们。这些EPackageError
异常是Delphi运行时告诉您调用LoadPackage
失败的方式
从字里行间看,我猜您已经处理了这些异常,您只需要设置错误模式。这可能是因为您没有安装正确的运行库。这就是你需要解决的问题。@DavidHeffernan:我知道,但我们有数百个已安装的应用程序和软件包不是由我交付给客户的。所以,它可以发生,独立于我所做的。你试图在你的程序中处理这个问题是错误的。提供一个合适的安装程序,安装所有依赖项。确保您可以控制交付的内容。如果用户的安装出错,他们会收到一条错误消息,必须重新安装。你怎么能指望从一个破碎的依赖中恢复过来?@DavidHeffernan:如果我们的关系只是一个小现实,你是对的。不幸的是,我不是唯一的开发者,我们每天发布几十个软件包。安装程序仅用于大型升级,在所有其他情况下,有人将软件包上载到客户数据库中,每个客户机应用程序都会自动更新自身。此外,开发我们的应用程序是为了能够在连续执行时从中断的依赖项中恢复。在我看来,到目前为止,您似乎已经滑冰了,但您已经达到了需要SCM的程度。你需要一种自动化的方法来确保每当你发布更新时(无论大小),你总是包含所有的依赖项。我正在FormCreate中执行SetProcessErrorMode,但错误对话框仍然出现。表单本身位于动态包中(主包加载其他动态包)。这是否会使SetProcessErrorMode无法正常工作?您可以轻松创建一个示例,说明此对话框的显示取决于错误模式。我不知道你的程序在做什么。请构建一个简单的项目,让自己相信错误模式如何影响显示此对话框的系统。当然,可能错误模式设置得太晚了。正如我所说,设置它的正确位置是在应用程序启动时。在主机exe中很早加载的单元的初始化部分执行此操作。再次读取此操作。我想知道您是否试图在无法加载的包中设置错误模式。显然,这不会有帮助。在host exe中,在初始化部分为第一个已初始化的单元设置一次,并且仅设置一次。