6

我有一个带有 4 个接口的 Delphi ActiveX 项目。其中两个具有用于 CoClass 的 AutoComObject 工厂。接口的所有方法都用安全调用声明。在与工厂的接口中,如果在任何方法中抛出异常,调用者会收到一个 EOleException 异常消息,该异常消息来自 activex 中的原始异常。但是在其他两个接口中,任何异常都被屏蔽为 EOleException,消息被屏蔽为“灾难性故障”。

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

4

1 回答 1

11

如果一个未处理的异常逃逸了safecall一个类的方法,TObject.SafeCallException()则调用该异常转换为一个HRESULT错误代码,然后由 COM 返回给调用者。默认情况下,TObject.SafeCallException()始终返回E_UNEXPECTED( $8000FFFF)。一个类可以重写SafeCallException()以返回更有意义的HRESULT. TComObjectTAutoIntfObject做到这一点,例如(他们还调用SetErrorInfo()设置有关异常的详细信息,调用者可以GetErrorInfo()根据需要使用这些信息进行检索)。所以听起来你的两个AutoComObject基于对象有一个SafeCallException()实现,而你的其他两个对象没有。

于 2013-10-16T21:37:35.917 回答