COM 错误代码的结构

下图显示了 HRESULT(或 SCODE)的格式;数字指示位位置:

Shows the format of an 'H RESULT' or 'S CODE' with numbers indicating bit positions.

HRESULT 或 SCODE 中的高顺序位指示返回值是表示成功还是失败。 如果设置为 0,SEVERITY_SUCCESS,则该值表示成功。 如果设置为 1,SEVERITY_ERROR,则表示失败。

预留 R、C、N、r 位。

“设施”字段表示导致错误的系统服务。 Microsoft 在必要时分配新的设施代码。 大多数 SCODE 和 HRESULT 值将设施字段设置为 FACILITY_ITF,指示接口方法错误。

下表介绍了常见的设施字段。

设施字段 说明
FACILITY_DISPATCH
2
适用于后期绑定 IDispatch 接口错误。
FACILITY_ITF
4
适用于从接口方法返回的大多数状态代码。 错误的实际含义由接口定义。 也就是说,从两个不同的接口返回的具有完全相同的 32 位值的两个 HRESULT 可能具有不同的含义。
FACILITY_NULL
0
适用于广泛适用的常见状态代码,例如 S_OK。
FACILITY_RPC
1
适用于从远程过程调用返回的状态代码。
FACILITY_STORAGE
3
适用于从与结构化存储相关的 IStorageIStream 方法调用返回的状态代码。 代码(低 16 位)值在 MS-DOS 错误代码范围内(即小于 256)的状态代码与相应的 MS-DOS 错误具有相同的含义。
FACILITY_WIN32
7
用于提供将 Windows API 中函数的错误代码作为 HRESULT 进行处理的方法。 16 位 OLE 中重复系统错误码的错误码也被更改为 FACILITY_WIN32。
FACILITY_WINDOWS
8
用于来自 Microsoft 定义的接口的其他错误代码。

代码字段是一个唯一的数字,用于表示错误或警告。

按照惯例,HRESULT 值的名称格式一般如下: Facility_Severity_Reason

Facility 是设施名称或其他可区分的标识符;Severity 是单个字母(S 或 E),指示函数调用是成功 (S) 还是生成错误 (E);Reason 是描述代码含义的标识符。 例如,状态代码 STG_E_FILENOTFOUND 指示发生了与存储相关的错误;具体而言,请求的文件不存在。 FACILITY_NULL 的状态代码省略了 Facility_ 前缀。

错误代码在接口实现的上下文中定义。 定义后,无法更改成功代码或添加新的成功代码。 但是,可以编写新的失败代码。 Microsoft 保留为 FACILITY_ITF 或新设施中描述的接口定义新失败代码(但不是成功代码)的权利。

COM 中的错误处理

Windows 协议:HRESULT