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