什么是ISupportErrorInfo
接口是什么意思?我理解它有点不知所措.来自MSDN:
此接口可确保错误信息可以正确地在调用链中传播.使用错误处理接口的自动化对象必须实现ISupportErrorInfo.
此方法指示接口是否支持IErrorInfo接口.
HRESULT InterfaceSupportsErrorInfo( REFIID riid );
返回S_OK意味着什么InterfaceSupportsErrorInfo
?你应该为所有接口返回S_OK吗?一些?
我对它的理解(基于一些相关的MSDN页面)是通过实现ISupportErrorInfo
,您指示您的类上的一个或多个接口通过调用返回错误信息SetErrorInfo
,而不是仅返回失败HRESULT
.
为此,您的实现ISuportErrorInfo::InterfaceSupportsErrorInfo
应S_OK
仅返回您的类上实际用于SetErrorInfo
将错误信息返回给调用者的那些接口,并且仅返回那些接口.
例如,假设您有一个实现您编写的IFoo
具有DoSomething
方法的接口的类.如果其他人创建了您的类和调用的实例,IFoo::DoSomething
如果DoSomething
返回失败,他们应该执行以下操作HRESULT
(从各种MSDN页面解释,但我从这里开始:http://msdn.microsoft.com/en-us/ library/ms221510.aspx):
调用QueryInterface
的IFoo
指针,以获得ISupportErrorInfo
对于正在实施的对象接口IFoo
如果被调用的对象没有实现ISupportErrorInfo
,则调用者必须根据该HRESULT
值处理错误
,或者将其传递给调用堆栈.
如果被调用对象确实实现了ISupportErrorInfo
,那么调用者应该调用ISupportErrorInfo::InterfaceSupportsErrorInfo
,REFIID
为返回错误的接口传入一个.在这种情况下,接口的DoSomething
方法IFoo
返回错误,因此您将传递REFIID_IFoo
(假设已定义)InterfaceSupportsErrorInfo
.
如果InterfaceSupportsErrorInfo
返回S_OK
,则调用者此时知道它可以通过调用来检索有关错误的更多详细信息
GetErrorInfo
.如果InterfaceSupportsErrorInfo
返回S_FALSE
,调用者可以假设被调用的接口不提供详细的错误信息,并且必须依赖返回的HRESULT来确定发生了什么.
这种有点令人困惑/错综复杂的错误处理API的原因似乎是灵活性(至于我无论如何都可以告诉我.毕竟这是 COM;).使用此设计,类可以支持多个接口,但并不是每个接口都需要用于SetErrorInfo
从其方法返回错误信息.您可以在类上选择某些选择返回详细错误信息SetErrorInfo
,而其他接口可以继续使用常规HRESULT
s来指示错误.
总之,ISupportErrorInfo
接口是一种通知调用代码的方法,您的类实现的至少一个接口可以返回详细的错误信息,并且该InterfaceSupportsErrorInfo
方法告诉调用者给定接口是否是这些接口之一.如果是,则调用者可以通过调用检索详细的错误信息GetErrorInfo
.