【问题标题】:Confused by MSDN "recommended way of handling errors" in COM被 MSDN 中 COM 中的“推荐的错误处理方式”弄糊涂了
【发布时间】:2014-06-18 13:47:18
【问题描述】:

我一直在阅读 MSDN 的 COM 开发指南。但是this page 上的代码令人困惑。在此复制:

以下代码示例显示了处理未知错误的推荐方法:

HRESULT hr; 
hr = xxMethod(); 

switch (GetScode(hr))  
{ 
    case NOERROR: 
      // Method returned success. 
      break; 

    case x1: 
      // Handle error x1 here.
      break; 

    case x2: 
      // Handle error x2 here.
      break; 

    case E_UNEXPECTED: 
    default: 
      // Handle unexpected errors here. 
      break; 
} 

GetScode 函数似乎没有定义,NOERROR 也没有定义,搜索 MSDN 也没有帮助。网络搜索表明GetScode 是一个将 HRESULT 转换为 SCODE 的宏,但是它们都是 32 位整数,所以我不确定它的用途。

有人建议它是一个历史工件,在 32 位系统上什么都不做,但在 16 位系统上它会将 hr 转换为 16 位 int。但是,如果这是真的,那么我看不出E_UNEXPECTED 将如何匹配,因为那是0x8000FFFF。此外,尚不清楚 x1 和 x2 是指 0x800..... 值,还是某种截断版本。

最后,此代码将所有成功值都视为错误。同一 MSDN 指南上的其他页面说应该使用 SUCCEEDED(hr) 或 FAILED(hr) 来确定成功或失败。

那么,这个代码示例真的是“推荐的方式”还是某种文档错误?

【问题讨论】:

  • 那一定是一个相当古老的文件。 GetScode 是一个 long 已过时的宏。它曾经是推荐的方式,但现在不再是。

标签: error-handling com msdn


【解决方案1】:

这是(相当)旧的东西。 SDK 中的winerror.h 文件是这样写的:

////////////////////////////////////
//                                //
//     COM Error Codes            //
//                                //
////////////////////////////////////


//
// The return value of COM functions and methods is an HRESULT.
// This is not a handle to anything, but is merely a 32-bit value
// with several fields encoded in the value. The parts of an
// HRESULT are shown below.
//
// Many of the macros and functions below were orginally defined to
// operate on SCODEs. SCODEs are no longer used. The macros are
// still present for compatibility and easy porting of Win16 code.
// Newly written code should use the HRESULT macros and functions.
//

我认为这很清楚。我会先信任 SDK,然后再信任文档。

我们可以看到,SCODE 在WTypesbase.h 中始终像这样定义(在最近的 SDK 中,在旧的 SDK 中,我认为它在另一个文件中):

typedef LONG SCODE;

所以它真的是 32 位的。

【讨论】:

    【解决方案2】:

    文字正确; 应该警惕盲目地从内部函数返回失败代码,特别是如果您的代码使用系统中其他地方定义的facility code。

    具体来说,在 COM 接口函数级别,您应该确保您返回的错误代码对您的接口有意义,并且您应该重新映射源自从函数内部到有意义的错误代码。

    但实际上,没有人这样做,这就是为什么您会看到奇怪且无法操作的错误对话框,例如“意外错误”。

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2019-01-12
      • 1970-01-01
      • 2014-08-14
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多