4

我们有一个从 ISAPI 应用程序执行的 Delphi 2007 COM 组件。COM 组件正在挂起应用程序,因为它正在尝试显示 MessageBox()。对 MessageBox() 的调用必须发生在 Delphi RTL 中,因为它不在我们的用户代码中。

应用程序挂起,当然,因为没有人在服务器上登录来清除 MessageBox()。

我们如何配置我们的 Delphi 项目,以便 Delphi RTL 不会尝试在异常时显示 MessageBox()?

4

5 回答 5

3

编写您自己的异常处理程序并将其附加到 Application.OnException 事件。如果存在 OnException 事件处理程序,应用程序将不会使用其默认的 MessageBox 例程。签名定义为:

TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;

如果这是服务器,您可能希望将异常信息写入日志,并可能向用户返回一些错误。

于 2009-06-03T15:20:22.750 回答
2

消息框说什么?我假设这是一个例外。为什么不在 COM 组件中的代码周围放置一个异常处理程序,并以不同的方式记录异常?(例如,使用事件日志)。和/或首先解决导致异常的问题。

于 2009-06-03T15:19:42.940 回答
1

我不知道 Delphi 有什么直接的方法,但你可以做的是在 AutoIT/AutoHotKey 中编写一个小脚本,并让该脚本在系统托盘中运行,这样它就会自动关闭 MessageBox。

相信我,这很简单。

http://www.autoitscript.com/autoit3/index.shtml

http://www.autohotkey.com/

高温高压

于 2009-06-03T14:26:35.013 回答
0

是否可以将应用程序编译为控制台应用程序?我不确定你是否可以这样做并且仍然让它包含 COM 对象,这将阻止显示消息对话框我敢肯定。

只是一个想法。

于 2009-06-04T10:18:12.487 回答
-1

我已经创建了一个单元来挂钩 MessageBox/MessageDlg 调用(通过绕行),所以我可以在 Windows 服务中抑制这些调用(以避免由于其他人的一些愚蠢代码在消息框调用中“挂起”我的服务 dll它)。如果你需要,我可以搜索这个单元并发送给你。

于 2009-06-04T08:18:00.170 回答