14

ISupportErrorInfo界面是什么意思?我有点不知所措。来自 MSDN:

此接口确保错误信息可以正确地沿调用链向上传播。使用错误处理接口的自动化对象必须实现 ISupportErrorInfo。

此方法指示接口是否支持 IErrorInfo 接口。

HRESULT InterfaceSupportsErrorInfo(
  REFIID riid
);

在中返回 S_OK 是什么意思InterfaceSupportsErrorInfo?您应该为所有接口返回 S_OK 吗?一些?

4

1 回答 1

22

我对它的理解(基于一些相关的 MSDN 页面)是,通过实现ISupportErrorInfo,您表明您的类上的一个或多个接口通过调用返回错误信息SetErrorInfo,而不是仅仅返回失败HRESULT

为此,您的实现ISuportErrorInfo::InterfaceSupportsErrorInfo应该S_OK只返回类上实际用于SetErrorInfo向调用者返回错误信息的那些接口,并且返回那些接口。

例如,假设您有一个实现您编写的接口的类,该接口IFoo具有一个DoSomething方法。如果其他人创建了您的类的实例并调用,如果返回失败IFoo::DoSomething,他们应该执行以下操作(从各种 MSDN 页面解释,但我从这里开始:http: //msdn.microsoft.com/en-us/库/ms221510.aspx):DoSomethingHRESULT

  • 调用指针以获取QueryInterface正在实现的对象的接口IFooISupportErrorInfoIFoo

  • 如果被调用的对象没有实现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 HRESULTs 来指示错误。

总之,ISupportErrorInfo接口是一种通知调用代码你的类实现的接口中的至少一个可以返回详细错误信息的方法,并且该InterfaceSupportsErrorInfo方法告诉调用者给定接口是否是这些接口之一。如果是这样,那么调用者可以通过调用来检索详细的错误信息GetErrorInfo

于 2008-10-06T04:40:21.053 回答