为什么HRESULT 0成功?

Fra*_*nce 4 c++ windows

我在使用HRESULT返回值时遇到了一些非常尴尬的事情,似乎成功是0而失败是1.这背后的逻辑是什么?

我实际上试过if(!hr)并失败了,浪费了我生命中的一小时,直到我发现实际的成功retval是0.我想打电话给那个认为这个白痴的人,但我会试着冷静下来 - 希望有人会阐明了这一惯例.

bho*_*nes 12

HRESULT的最初目的是正式布局公共和Microsoft内部使用的错误代码范围,以防止OS/2操作系统的不同子系统中的错误代码之间的冲突.

这就是为什么,0(HRESULT的最高位)的值意味着"没有错误",即成功.

但是应该注意,因为HRESULT可能将最高位设置为0,而其他位设置为0.这意味着,检查if(0 == hr) { ... }可能不适用于某些成功案例.检查成功的正确方法是if(0 <= hr) { ... }.

维基百科有更详细的信息.

SUCCEEDEDFAILED宏可用于避免在处理HRESULT值时出错.if(0 <= hr) { ... }并且if(SUCCEEDED(hr)) { ... }基本上是相同的东西.