我有一个带有 4 个接口的 Delphi ActiveX 项目。其中两个具有用于 CoClass 的 AutoComObject 工厂。接口的所有方法都用安全调用声明。在与工厂的接口中,如果在任何方法中抛出异常,调用者会收到一个 EOleException 异常消息,该异常消息来自 activex 中的原始异常。但是在其他两个接口中,任何异常都被屏蔽为 EOleException,消息被屏蔽为“灾难性故障”。
任何人都知道为什么会发生这种情况,以及如何使原始异常消息不被屏蔽?
如果一个未处理的异常逃逸了safecall
一个类的方法,TObject.SafeCallException()
则调用该异常转换为一个HRESULT
错误代码,然后由 COM 返回给调用者。默认情况下,TObject.SafeCallException()
始终返回E_UNEXPECTED
( $8000FFFF
)。一个类可以重写SafeCallException()
以返回更有意义的HRESULT
. TComObject
并TAutoIntfObject
做到这一点,例如(他们还调用SetErrorInfo()
设置有关异常的详细信息,调用者可以GetErrorInfo()
根据需要使用这些信息进行检索)。所以听起来你的两个AutoComObject
基于对象有一个SafeCallException()
实现,而你的其他两个对象没有。