【问题标题】:Implementation of ISupportErrorInfo - what does it mean?ISupportErrorInfo 的实现 - 这是什么意思?
【发布时间】:2010-09-15 10:26:52
【问题描述】:

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

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

这个方法表示是否 一个接口支持 IErrorInfo 界面。

HRESULT InterfaceSupportsErrorInfo(
  REFIID riid
);

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

【问题讨论】:

    标签: com error-handling


    【解决方案1】:

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

    为此,您的ISuportErrorInfo::InterfaceSupportsErrorInfo 实现应仅针对您的类上实际使用SetErrorInfo 向调用者返回错误信息的那些接口返回S_OK,并且仅那些接口.

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

    • 在IFoo 指针上调用QueryInterface 以获取实现IFoo 的对象的ISupportErrorInfo 接口

    • 如果被调用对象没有实现ISupportErrorInfo, 那么来电者将有 处理错误的基础上 HRESULT 值,或将其向上传递到调用堆栈。

    • 如果被调用对象确实实现了ISupportErrorInfo,那么调用者应该调用ISupportErrorInfo::InterfaceSupportsErrorInfo,并为返回错误的接口传入REFIID。在这种情况下,IFoo 接口的DoSomething 方法返回了错误,因此您将REFIID_IFoo(假设已定义)传递给InterfaceSupportsErrorInfo。

    • 如果InterfaceSupportsErrorInfo 返回S_OK,然后是调用者 在这一点上知道它可以 检索更详细的信息 通过调用关于错误 GetErrorInfo。如果InterfaceSupportsErrorInfo返回S_FALSE,调用者可以假设被调用的接口没有提供详细的错误信息,并且必须依赖返回的HRESULT来确定发生了什么。

    这个有点令人困惑/令人费解的错误处理 API 的原因似乎是为了灵活性(据我所知,这毕竟是 COM ;)。通过这种设计,一个类可以支持多个接口,但并不是每个接口都需要使用SetErrorInfo 从其方法中返回错误信息。你可以让你的类上的某些选择接口通过SetErrorInfo返回详细的错误信息,而其他接口可以继续使用正常的HRESULTs来指示错误。

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

    【讨论】:

    • "如果被调用的对象确实实现了 ISupportErrorInfo,那么调用者应该为 ISupportErrorInfo 查询接口" 这可能是一个错误,因为调用者只是 DID 之前的调用以确定是否支持此接口第一名?呼叫者不应该直接拨打ISupportErrorInfo::InterfaceSupportsErrorInfo而不必第二次拨打QI吗?
    • @FelixDombek 我同意。我编辑了帖子以删除多余的QueryInterface 电话。
    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 2013-08-17
    • 2011-09-04
    相关资源
    最近更新 更多