我对它的理解(基于一些相关的 MSDN 页面)是,通过实现ISupportErrorInfo
,您表明您的类上的一个或多个接口通过调用返回错误信息SetErrorInfo
,而不是仅仅返回失败HRESULT
。
为此,您的实现ISuportErrorInfo::InterfaceSupportsErrorInfo
应该S_OK
只返回类上实际用于SetErrorInfo
向调用者返回错误信息的那些接口,并且只返回那些接口。
例如,假设您有一个实现您编写的接口的类,该接口IFoo
具有一个DoSomething
方法。如果其他人创建了您的类的实例并调用,如果返回失败IFoo::DoSomething
,他们应该执行以下操作(从各种 MSDN 页面解释,但我从这里开始:http: //msdn.microsoft.com/en-us/库/ms221510.aspx):DoSomething
HRESULT
调用指针以获取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
从其方法返回错误信息。你可以让你的类上的某些,select 接口通过 来返回详细的错误信息SetErrorInfo
,而其他接口可以继续使用 normal HRESULT
s 来指示错误。
总之,ISupportErrorInfo
接口是一种通知调用代码你的类实现的接口中的至少一个可以返回详细错误信息的方法,并且该InterfaceSupportsErrorInfo
方法告诉调用者给定接口是否是这些接口之一。如果是这样,那么调用者可以通过调用来检索详细的错误信息GetErrorInfo
。