ISupportErrorInfo
界面是什么意思?我有点无法理解它。来自 MSDN:
该接口确保错误 信息可以向上传播 正确调用链。自动化 使用错误处理的对象 接口必须实现 ISupportErrorInfo.
该方法指示是否 接口支持 IErrorInfo 接口。
HRESULT InterfaceSupportsErrorInfo(
REFIID riid
);
InterfaceSupportsErrorInfo
中返回S_OK是什么意思?是否应该为所有接口返回 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
来指示错误。总而言之,
ISupportErrorInfo
接口是一种通知调用代码您的类实现的至少一个接口可以返回详细错误信息的方法,并且
InterfaceSupportsErrorInfo
方法告诉调用者给定的接口是否是其中之一接口。如果是这样,那么调用者可以通过调用
GetErrorInfo
来检索详细的错误信息。
ICreateErrorInfo::SetDescription 设置自定义文本错误消息。
已弃用的 Microsoft 文章返回错误信息 提供了有关如何设置错误的良好概述(以及流程图!)。 以下引用包含更新的链接:
返回错误信息一旦设置错误,该方法应避免显示任何类型的模式对话框或进行其他调用 - 即该方法应在调用
SetErrorInfo
后立即返回。 同样,调用者应在调用返回后立即使用
GetErrorInfo
检索错误。