HRESULT中关于S_OK,S_FALSE和 E_FAIL浅析

本文深入探讨了COM服务器中常用的HRESULT返回值S_OK、S_FALSE和E_FAIL的意义及用法。通过解析HRESULT的布局,解释了这三个返回值在程序逻辑和错误处理中的作用。同时强调了S_FALSE和S_OK的区别,指出S_FALSE虽然表示成功,但结果可能不符合预期。最后,提供了一种判断返回值的方法,即使用SUCCEEDED和FAILED宏来确保程序能够正确响应不同的返回状态。
 

S_OK是COM服务器返回正确

S_FALSE是COM服务器返回错误,不过这个错误是可以不处理的,不影响程序正常运行。只是结果不是想要的

E_FAIL是必须处理的错误。

// // HRESULTs are 32 bit values layed out as follows: // // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 // +-+-+-+-+-+---------------------+-------------------------------+ // |S|R|C|N|r| Facility | Code | // +-+-+-+-+-+---------------------+-------------------------------+ // // where // // S - Severity - indicates success/fail // // 0 - Success // 1 - Fail (COERROR) #define E_FAIL _HRESULT_TYPEDEF_(0x80004005L) #define S_OK ((HRESULT)0x00000000L) #define S_FALSE ((HRESULT)0x00000001L) #define SUCCEEDED(hr) ((HRESULT)(hr) >= 0) #define FAILED(hr) ((HRESULT)(hr) < 0)

     返回E_FAIL,是告诉调用程序--某些地方出错,必须进行处理。否则,程序不能进行下去了。

     返回S_FALSE,不是表示出现错误。

     而S_OK和S_FALSE,则程序逻辑的不同表示。如果将它们表示成S_1和S_2可能更好理解些!

     调用程序只需对返回的S_OK和S_FALSE进行判断,然后决定程序的走向。

     最主要的误解是由S_FALSE的名称带来的。     

     所以在使用SUCCEEDED和FAILED来判断返回值的时候,需注意S_FALSE也表示成功,只是其结果并不是想要的,因此FAILED(S_FALSE)返回为"非",SUCCEEDED同理。

     当自己写的函数接口返回值为HRESULT的时候,如果想要指明其出错,并且必须被处理时,应返回E_FAIL.

### 三级标题:COM 组件调用错误 HRESULT E_FAIL 的可能原因解决方法 在调用 COM 组件时出现 `HRESULT E_FAIL` 错误通常表示调用过程中发生了某种内部失败,但具体原因可能涉及多个方面,包括权限配置、组件依赖、参数传递以及运行时环境问题。以下是可能的原因及其对应的解决方法: - **权限配置不足**:某些 COM 组件(如 ArcGIS 的 Geoprocessing 工具)需要特定的许可权限才能运行。如果当前环境中未启用足够的权限(如 ArcInfo 许可),可能导致组件无法正常执行并返回 `E_FAIL` 错误。此时需要在 ArcGIS 环境中手动启用高级许可或通过代码设置权限以确保组件具备足够的执行权限[^2]。 - **组件依赖缺失或注册失败**:COM 组件可能依赖其他 DLL 或服务,如果这些依赖项未正确注册或缺失,会导致组件初始化失败。可以尝试重新注册相关 DLL 文件,或使用 `sfc /scannow` 检查系统文件完整性,确保所有依赖组件处于正常状态。 - **参数传递不正确或数据格式不兼容**:调用 COM 组件时,如果传入的参数类型不匹配、格式不正确或参数值无效,也可能导致执行失败。应仔细检查调用接口的参数定义,确保输入参数与组件预期的格式类型一致,并在调用前后添加日志输出以辅助调试。 - **异常信息未捕获或未输出**:部分 COM 组件在出错时不会自动输出详细的错误信息,导致 `E_FAIL` 错误难以定位。可以通过在调用时捕获异常并调用 `GetMessages` 方法获取更详细的错误描述。例如,在 ArcGIS 的 Geoprocessing 工具调用中,可以使用以下代码捕获并显示错误信息[^3]: ```csharp object sev = null; try { // Execute the tool. gp.Execute(ToCAD, null); Console.WriteLine(gp.GetMessages(ref sev)); } catch (Exception ex) { // Print geoprocessing execution error messages. MessageBox.Show(gp.GetMessages(ref sev)); } ``` - **运行时环境配置错误**:COM 组件可能依赖特定的运行时环境(如 .NET Framework 版本、COM+ 服务配置等)。如果当前系统环境未正确配置,可能导致组件无法加载或运行失败。此时应检查目标系统是否安装了所需的运行时库,并确保 COM 服务配置正确。 - **组件版本不兼容或存在 Bug**:不同版本的 COM 组件可能存在兼容性问题或已知的 Bug,尤其是在跨版本调用时。建议检查组件的版本兼容性文档,并尝试更新到最新版本以修复潜在问题。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值