我们有一个从 ISAPI 应用程序执行的 Delphi 2007 COM 组件。COM 组件正在挂起应用程序,因为它正在尝试显示 MessageBox()。对 MessageBox() 的调用必须发生在 Delphi RTL 中,因为它不在我们的用户代码中。
应用程序挂起,当然,因为没有人在服务器上登录来清除 MessageBox()。
我们如何配置我们的 Delphi 项目,以便 Delphi RTL 不会尝试在异常时显示 MessageBox()?
编写您自己的异常处理程序并将其附加到 Application.OnException 事件。如果存在 OnException 事件处理程序,应用程序将不会使用其默认的 MessageBox 例程。签名定义为:
TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;
如果这是服务器,您可能希望将异常信息写入日志,并可能向用户返回一些错误。
消息框说什么?我假设这是一个例外。为什么不在 COM 组件中的代码周围放置一个异常处理程序,并以不同的方式记录异常?(例如,使用事件日志)。和/或首先解决导致异常的问题。
我不知道 Delphi 有什么直接的方法,但你可以做的是在 AutoIT/AutoHotKey 中编写一个小脚本,并让该脚本在系统托盘中运行,这样它就会自动关闭 MessageBox。
相信我,这很简单。
高温高压
是否可以将应用程序编译为控制台应用程序?我不确定你是否可以这样做并且仍然让它包含 COM 对象,这将阻止显示消息对话框我敢肯定。
只是一个想法。
我已经创建了一个单元来挂钩 MessageBox/MessageDlg 调用(通过绕行),所以我可以在 Windows 服务中抑制这些调用(以避免由于其他人的一些愚蠢代码在消息框调用中“挂起”我的服务 dll它)。如果你需要,我可以搜索这个单元并发送给你。