ISupportErrorInfo
界面是什么意思?我理解它有点不知所措。来自MSDN:
此接口可确保出错 信息可以向上传播 正确调用链。自动化 使用错误处理的对象 接口必须实现 ISupportErrorInfo。
此方法表示是否 接口支持IErrorInfo 接口
HRESULT InterfaceSupportsErrorInfo(
REFIID riid
);
在InterfaceSupportsErrorInfo
中返回S_OK是什么意思?你应该为所有接口返回S_OK吗?只是一些?
答案 0 :(得分:19)
我对它的理解(基于一些相关的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
来指示错误。
总之,ISupportErrorInfo
接口是一种通知调用代码的方法,您的类实现的至少一个接口可以返回详细的错误信息,InterfaceSupportsErrorInfo
方法告诉调用者是否给定接口是其中一个接口。如果是,则调用者可以通过调用GetErrorInfo
来检索详细的错误信息。