C语言 为什么窗口返回代码称为 HRESULT



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

H是什么意思?

此处所述的结果句柄 COM 中的 MSDN 错误处理

文档只说:

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

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

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

HRESULT(用于结果句柄)是一种返回成功、警告和错误值的方法。 HRESULT真的不是任何东西的把柄;它们只是在值中编码了多个字段的值。

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

幸运的是,历史学家雷蒙德·陈(Raymond Chen)一直在保存这种知识。在标题恰如其分的条目中 为什么HRESULT以 H 开头,而它不是任何东西的句柄?他写道:

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

本文件最后总结如下:

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

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

<小时 />

额外阅读:

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

<小时 />

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

十六

进制结果。

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

有关位字段结构的详细信息,请参阅开发人员中心Microsoft主题 COM 错误代码的结构和 MSDN HRESULT 结构。

最新更新