【问题标题】:Why do most HANDLE related functions return 0 upon failure?为什么大多数与 HANDLE 相关的函数在失败时返回 0?
【发布时间】:2016-07-08 07:58:45
【问题描述】:

大多数返回句柄的函数,例如OpenProcessOpenFileOpenThreadFindWindow 等,在失败时返回 0。我了解返回无效结果以指示失败是一种好习惯。但是,如果windows选择-1作为INVALID_HANDLE_VALUE,为什么这些函数在失败时不返回-1

【问题讨论】:

  • 我认为这就是我们所说的历史设计选择。除了做出选择的人之外,每个人都不知道为什么做出选择。但是一旦做出选择,向后兼容性就意味着它不能被改变。
  • 那么INVALID_HANDLE_VALUE 是干什么用的?为什么 MS 还保留那个宏?
  • @user3386109 完全同意。还有一点是,在 MS OS 的第一个版本中,指向资源的指针的句柄和空值可以与 NULL 指针进行比较。
  • 也许这个:blogs.msdn.microsoft.com/oldnewthing/20040302-00/?p=40443 提供了更多提示
  • 这是Unix投下的长长的影子,大量代码通过xenix移植到win16。它的 open() 函数以 -1 失败,0 是标准输出流的有效“句柄”。

标签: c windows visual-c++ handle


【解决方案1】:

您可以做出许多猜想,但是是的,原因是历史性的,并且由于在将旧 16 位代码移植到新代码的过程中的兼容性。
一些函数在失败时最初返回-1,考虑到 C 习惯在失败时返回负值。
迁移到新的 32 位版本,出于上述兼容性的原因,导致创建 INVALID_HANDLE_VALUE 等于 -1
但是因为句柄有时是真正的指针,并且为了比较 NULL 值的简单性,许多新函数被设计为在失败时返回 NULL
有趣的一点是INVALID_HANDLE_VALUE 在数值上恰好等于GetCurrentProcess() 返回的伪句柄。因此,在某些函数中使用无效句柄可能会导致有效结果或可怕的死锁,例如在调用 WaitForSingleObject 时使用的 INVALID_HANDLE_VALUE。这将导致当前进程无休止地等待。
你可以在这里找到作者讲述的整个故事https://blogs.msdn.microsoft.com/oldnewthing/20040302-00/?p=40443

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 2019-11-19
    • 2023-02-11
    • 1970-01-01
    • 2014-09-20
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    相关资源
    最近更新 更多