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