ISupportErrorInfo 的实现 - 这意味着什么?

问题描述 投票:0回答:2

ISupportErrorInfo
界面是什么意思?我有点无法理解它。来自 MSDN:

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

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

HRESULT InterfaceSupportsErrorInfo(
  REFIID riid
);

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

com error-handling
2个回答
23
投票

我对它的理解(基于一些相关的 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
 来检索详细的错误信息。


0
投票
可以通过

ICreateErrorInfo::SetDescription 设置自定义文本错误消息。

已弃用的 Microsoft 文章

返回错误信息 提供了有关如何设置错误的良好概述(以及流程图!)。 以下引用包含更新的链接:

返回错误信息

    实现
  1. ISupportErrorInfo 接口。
  2. 要创建通用错误对象的实例,请调用
  3. CreateErrorInfo 函数。
  4. 要设置其内容,请使用
  5. ICreateErrorInfo 方法
  6. 要将错误对象与当前逻辑线程关联,请调用
  7. SetErrorInfo 函数。
一旦设置错误,该方法应避免显示任何类型的模式对话框或进行其他调用 - 即该方法应在调用

SetErrorInfo

 后立即返回。  同样,调用者应在调用返回后立即使用 
GetErrorInfo
 检索错误。

© www.soinside.com 2019 - 2024. All rights reserved.