防止Delphi COM组件显示MessageBox()

时间:2009-06-03 13:54:37

标签: delphi com isapi

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

相信我这很简单。

  

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

     

http://www.autohotkey.com/

HTH

答案 3 :(得分:0)

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

只是一个想法。

答案 4 :(得分:-1)

我创建了一个挂钩MessageBox / MessageDlg调用的单元(通过绕行),所以我可以在Windows服务中禁止这些调用(以避免“挂起”我的服务dll,因为有些人的愚蠢代码消息箱中的电话)。 如果你需要,我可以搜索这个单位并发送给你。