gpt4 book ai didi

error-handling - 由COM中的MSDN “recommended way of handling errors”混淆

转载 作者:行者123 更新时间:2023-12-03 08:30:56 29 4
gpt4 key购买 nike

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

The following code sample shows the recommended way of handling unknown errors:


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位整数,因此我不确定它的用途。

有人认为这是一个历史 Artifact ,在32位系统上不执行任何操作,但在16位系统上将 hr转换为16位int。但是,如果这是真的,那么我看不到 E_UNEXPECTED如何匹配,因为那是 0x8000FFFF。同样,还不清楚 x1x2是注定是 0x800.....值还是某种截短的版本。

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

那么,此代码示例是否真的是“推荐方式”,或者是某种文档失误?

最佳答案

这是(漂亮的)旧东西。 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位。

关于error-handling - 由COM中的MSDN “recommended way of handling errors”混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24276344/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com