我有一个带有4个接口的Delphi ActiveX项目。其中两个为其CoClasses提供了AutoComObject工厂。接口的所有方法都使用safecalls声明。在与工厂的接口中,如果在任何方法中抛出异常,则调用方将收到EOleException,其中包含来自activex中原始异常的异常消息。但是在其他两个接口中,任何异常都被屏蔽为EOleException,并且消息被屏蔽为“灾难性故障”。
任何人都知道为什么会这样,以及如何使原始异常消息不被屏蔽?
答案 0 :(得分:9)
如果未处理的异常转义类的safecall
方法,则调用TObject.SafeCallException()
将异常转换为HRESULT
错误代码,然后由COM返回给调用者。默认情况下,TObject.SafeCallException()
始终返回E_UNEXPECTED
($8000FFFF
)。类可以覆盖SafeCallException()
以返回更有意义的HRESULT
。例如,TComObject
和TAutoIntfObject
完全相同(他们还会调用SetErrorInfo()
来设置有关异常的详细信息,如果需要,调用者可以使用GetErrorInfo()
检索该异常。所以听起来你的两个基于AutoComObject
的对象有一个SafeCallException()
实现,而你的另外两个对象则没有。