Error handling 被MSDN“迷惑”;“处理错误的推荐方法”;在COM中
我一直在阅读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。此
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;