COM接口始终屏蔽异常消息“灾难性故障”

时间:2013-10-16 20:11:14

标签: delphi exception activex message

我有一个带有4个接口的Delphi ActiveX项目。其中两个为其CoClasses提供了AutoComObject工厂。接口的所有方法都使用safecalls声明。在与工厂的接口中,如果在任何方法中抛出异常,则调用方将收到EOleException,其中包含来自activex中原始异常的异常消息。但是在其他两个接口中,任何异常都被屏蔽为EOleException,并且消息被屏蔽为“灾难性故障”。

任何人都知道为什么会这样,以及如何使原始异常消息不被屏蔽?

1 个答案:

答案 0 :(得分:9)

如果未处理的异常转义类的safecall方法,则调用TObject.SafeCallException()将异常转换为HRESULT错误代码,然后由COM返回给调用者。默认情况下,TObject.SafeCallException()始终返回E_UNEXPECTED$8000FFFF)。类可以覆盖SafeCallException()以返回更有意义的HRESULT。例如,TComObjectTAutoIntfObject完全相同(他们还会调用SetErrorInfo()来设置有关异常的详细信息,如果需要,调用者可以使用GetErrorInfo()检索该异常。所以听起来你的两个基于AutoComObject的对象有一个SafeCallException()实现,而你的另外两个对象则没有。