【问题标题】:Why is the windows return code called HRESULT?为什么windows返回码叫HRESULT?
【发布时间】:2014-11-18 18:15:22
【问题描述】:

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

H 是什么意思?

【问题讨论】:

  • 这个问题似乎离题了,因为它与编程问题无关。
  • @numerodix:据我所知,HRESULT 类型是 OLE\COM 的标准类型,而不是整个 win32 的标准类型。这个问题也是完全题外话。
  • 如果 SO 是针对编程代码问题的扩展常见问题解答的问答网站,我认为应该包括编码的基础术语。或者这应该是发布给程序员交流的问题吗?
  • “句柄”是系统匈牙利语。 this MSDN article中的第一段。
  • 这不是题外话。问题不一定是关于问题,它可以是一般问题。而且这个问题涉及到编程中使用的数据类型,所以是相关的。

标签: c windows hresult


【解决方案1】:

结果句柄here at MSDN Error Handling in COM所述

【讨论】:

    【解决方案2】:

    documentation 只说:

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

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

    【讨论】:

      【解决方案3】:

      十六进制结果。

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

      位域结构的详细信息可以在here at Microsoft Dev Center's topic Structure of COM Error Codeshere at MSDN HRESULT Structure找到。

      【讨论】:

        【解决方案4】:

        Windows data types 中的H-前缀通常指定句柄类型1(例如HBRUSHHWND)。 documentation 似乎是一致的,有点:

        HRESULT(用于结果句柄)是一种返回成功、警告和错误值的方法。 HRESULTs 真的不是什么都可以处理的;它们只是在值中编码了多个字段的值。

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

        幸运的是,历史学家 Raymond Chen 不断conserving 这种知识。在标题为Why does HRESULT begin with H when it’s not a handle to anything? 的条目中,他写道:

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

        该文件的结尾如下:

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

        总结:HRESULT曾经是句柄类型,但不再是句柄类型。整个信息现在在值本身中为encoded


        额外阅读:

        句柄类型随着时间的推移失去其引用语义并非没有先例。 What is the difference between HINSTANCE and HMODULE? 涵盖了另一个突出的例子。


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

        【讨论】:

          猜你喜欢
          • 2014-04-24
          • 2022-01-01
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-17
          • 2011-02-05
          相关资源
          最近更新 更多