ISupportErrorInfo的实现 - 这是什么意思?

时间:2008-10-06 01:04:02

标签: com error-handling

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

  

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

     

此方法表示是否   接口支持IErrorInfo   接口

HRESULT InterfaceSupportsErrorInfo(
  REFIID riid
);

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

1 个答案:

答案 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来检索详细的错误信息。