Error handling 被MSDN“迷惑”;“处理错误的推荐方法”;在COM中

Error handling 被MSDN“迷惑”;“处理错误的推荐方法”;在COM中,error-handling,com,msdn,Error Handling,Com,Msdn,我一直在阅读MSDN的COM开发指南。然而,上面的代码令人困惑。在此复制: 以下代码示例显示了处理未知错误的推荐方法: GetScode函数似乎没有定义,NOERROR,搜索MSDN也没有帮助。web搜索表明,GetScode是一个将HRESULT转换为SCODE的宏,但是这两个都是32位整数,所以我不确定它的用途 有人建议,这是一个历史工件,在32位系统上不起任何作用,但在16位系统上,它将hr转换为16位int。然而,如果这是真的,那么我看不出E_将如何匹配,因为这是0x8000FFFF。此

我一直在阅读MSDN的COM开发指南。然而,上面的代码令人困惑。在此复制:

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

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

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

最后,此代码将除一个成功值外的所有成功值都视为错误。同一MSDN指南的其他页面指出,应使用
成功(hr)
失败(hr)
来确定成功与失败

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

文本是正确的;人们应该警惕从内部函数盲目返回故障代码,特别是当您的代码使用系统中其他地方定义的错误代码时

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

但实际上,没有人会这样做,这就是为什么你会看到奇怪的、不可操作的错误对话框,比如“意外错误”。

这是(相当)古老的东西。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中,我认为它在另一个文件中):


所以它实际上是一个32位的文件。

那一定是一个非常旧的文件
GetScode
是一个早已过时的宏。它曾经是推荐的方式,但现在不再是了。
////////////////////////////////////
//                                //
//     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.
//
typedef LONG SCODE;