HRESULT中S_OK,S_FALSE和 E_FAIL(转载)

S_OK, S_FALSE 中的S,指SUCCEEDED, E_FAIL指的是ERROR,  HRESULT hr;  if(FAILED(hr)),判断的是 S_ 或者 E_


来源:http://blog.csdn.net/vblittleboy/article/details/6787503


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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值