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 |
用于提供作为 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或新设施中所述接口定义新故障代码 (但未成功代码) 的权利。