13

Windows C/C++ API 中函数的标准返回类型称为HRESULT.

H 是什么意思?

4

4 回答 4

11

结果句柄,如MSDN 错误处理中所述

于 2015-10-14T21:42:37.133 回答
5

文档只说:

COM 函数和方法的返回值是一个HRESULT,它不是一个对象的句柄,而是一个 32 位的值,其中多个字段编码在一个 32 位的 ULONG 变量中。

这似乎表明它代表“句柄”,但在这种情况下被滥用。

于 2014-11-18T18:17:53.680 回答
4

十六进制结果。

HRESULT 以 0x80070005 的形式列出。它们是由 COM\OLE 调用返回的数字,用于指示各种类型的 SUCCESS 或 FAILURE。代码本身由一个位字段结构组成,供那些想要深入研究细节的人使用。

位域结构的详细信息可在 Microsoft 开发中心的主题 COM 错误代码结构MSDN HRESULT 结构中找到。

于 2014-11-18T18:31:20.520 回答
2

Windows 数据类型中的H-prefix通常指定句柄类型1(例如或)。文档似乎是一致的,有点:HBRUSHHWND

( HRESULTfor result handle ) 是一种返回成功、警告和错误值的方法。HRESULTs 真的不是任何东西的句柄;它们只是在值中编码了几个字段的值。

换句话说:结果句柄实际上不是任何东西的句柄。显然,事情不可能设计得如此混乱。这里一定有其他事情发生。

幸运的是,历史学家 Raymond Chen 不断地保存着这种知识。在标题恰当的条目中,当它不是任何东西的句柄时,为什么HRESULT以 H 开头?他写:

据我了解,在过去,它确实是一个包含丰富错误信息的对象的句柄。例如,如果错误是级联错误,则它具有指向前一个错误的链接。从结果句柄中,您可以提取错误的完整历史,从它的起源到传播或转换它的所有函数,直到它最终到达您的手中。

该文件以以下内容结束:

COM 团队认为成本/收益根本不值得,所以HRESULT变成了一个简单的数字。但是名字卡住了。

总之:HRESULT曾经是句柄类型,但不再是句柄类型。整个信息现在被编码在值本身中。


额外阅读:

随着时间的推移,句柄类型失去其引用语义并非没有先例。HINSTANCE 和 HMODULE 有什么区别?涵盖了另一个突出的例子。


1 句柄类型存储实际值本身没有意义的值;它用作对实现私有的其他数据的引用。

于 2022-02-27T10:39:54.560 回答