Windows C/C++ API 中函数的标准返回类型称为HRESULT
.
H 是什么意思?
结果句柄,如MSDN 错误处理中所述
文档只说:
COM 函数和方法的返回值是一个HRESULT,它不是一个对象的句柄,而是一个 32 位的值,其中多个字段编码在一个 32 位的 ULONG 变量中。
这似乎表明它代表“句柄”,但在这种情况下被滥用。
十六进制结果。
HRESULT 以 0x80070005 的形式列出。它们是由 COM\OLE 调用返回的数字,用于指示各种类型的 SUCCESS 或 FAILURE。代码本身由一个位字段结构组成,供那些想要深入研究细节的人使用。
位域结构的详细信息可在 Microsoft 开发中心的主题 COM 错误代码结构和MSDN HRESULT 结构中找到。
Windows 数据类型中的H
-prefix通常指定句柄类型1(例如或)。文档似乎是一致的,有点:HBRUSH
HWND
(
HRESULT
for result handle ) 是一种返回成功、警告和错误值的方法。HRESULT
s 真的不是任何东西的句柄;它们只是在值中编码了几个字段的值。
换句话说:结果句柄实际上不是任何东西的句柄。显然,事情不可能设计得如此混乱。这里一定有其他事情发生。
幸运的是,历史学家 Raymond Chen 不断地保存着这种知识。在标题恰当的条目中,当它不是任何东西的句柄时,为什么HRESULT
以 H 开头?他写:
据我了解,在过去,它确实是一个包含丰富错误信息的对象的句柄。例如,如果错误是级联错误,则它具有指向前一个错误的链接。从结果句柄中,您可以提取错误的完整历史,从它的起源到传播或转换它的所有函数,直到它最终到达您的手中。
该文件以以下内容结束:
COM 团队认为成本/收益根本不值得,所以
HRESULT
变成了一个简单的数字。但是名字卡住了。
总之:HRESULT
值曾经是句柄类型,但不再是句柄类型。整个信息现在被编码在值本身中。
额外阅读:
随着时间的推移,句柄类型失去其引用语义并非没有先例。HINSTANCE 和 HMODULE 有什么区别?涵盖了另一个突出的例子。
1 句柄类型存储实际值本身没有意义的值;它用作对实现私有的其他数据的引用。