COM 错误代码的结构
下图显示了 HRESULT(或 SCODE)的格式;数字指示位位置:
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 |
适用于从与结构化存储相关的 IStorage 或 IStream 方法调用返回的状态代码。 代码(低 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 或新设施中描述的接口定义新失败代码(但不是成功代码)的权利。