Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么HRESULT 0表示成功?_C++_Windows - Fatal编程技术网

C++ 为什么HRESULT 0表示成功?

C++ 为什么HRESULT 0表示成功?,c++,windows,C++,Windows,在使用HRESULT返回值时,我遇到了一些非常尴尬的情况,似乎成功是0,失败是1。这背后的逻辑是什么 实际上,我尝试了if(!hr),但失败惨重,浪费了我生命中的一个小时,直到我发现实际的成功率为0。我想把想到这个的人叫做白痴,但我会尽量冷静下来,希望有人能对这一惯例有所了解。HRESULT的最初目的是正式列出供公众和Microsoft内部使用的错误代码范围,以防止OS/2操作系统不同子系统中的错误代码发生冲突 这就是为什么0(HRESULT的最高位)表示“无错误”,即成功 但应该小心,因为HR

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


实际上,我尝试了
if(!hr)
,但失败惨重,浪费了我生命中的一个小时,直到我发现实际的成功率为0。我想把想到这个的人叫做白痴,但我会尽量冷静下来,希望有人能对这一惯例有所了解。

HRESULT的最初目的是正式列出供公众和Microsoft内部使用的错误代码范围,以防止OS/2操作系统不同子系统中的错误代码发生冲突

这就是为什么0(HRESULT的最高位)表示“无错误”,即成功


但应该小心,因为HRESULT可能将最高位设置为0,而其他位设置为不同于0。这意味着,检查
if(0==hr){…}
对于某些成功的案例可能不起作用。检查成功的正确方法是
if(0您又错了,因为几乎所有系统中的所有系统错误返回值为0表示成功,非零返回值表示错误代码,使用此技术,我们可以仅使用一个返回值报告不同类型的错误。但是对于
HRESULT
,我们有
=0
表示成功,
0表示警告或通知关于函数,0表示绝对成功,您通常应该使用
succeed
FAILED
宏来测试
HRESULT
s,因为尽管绝大多数函数返回
s_OK
(值=0)表示成功,但存在soe非零成功值(例如
s_FALSE
)。通常,在可能返回这些值的情况下,您需要显式测试这些值,但在一般情况下,使用
successed
更清晰、更安全

if (SUCCEEDED(hr)) { // ...

这是一个非常常见的约定,不仅限于Microsoft—通常只有一种成功方式,也有多种失败方式,因此0=成功,使用0以外的值来指示失败原因。经验法则是“当您看到非布尔错误代码时,请检查其可能值的范围和含义”.Ah,这是有好处的。因为使用retval检查点而不是异常-我可以看到这有什么帮助。好吧,这会清除它!谢谢!我不明白为什么这应该只是/original/目的。HRESULT不仅指示错误标志,还指示错误设施和详细信息。这在今天被广泛使用。这个HRESULT表与使用MSDN信息:
if (SUCCEEDED(hr)) { // ...