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
用于提供作为 HRESULT 处理 Windows API 中函数的错误代码的方法。 16 位 OLE 中重复的系统错误代码也已更改为FACILITY_WIN32。
FACILITY_WINDOWS
8
用于 Microsoft 定义的接口中的其他错误代码。

代码字段是分配给表示错误或警告的唯一数字。

按照约定, HRESULT 值通常采用以下格式: Facility_Severity_Reason

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

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

COM 中的错误处理

Windows协议:HRESULT