C语言 为什么大多数 HANDLE 相关函数在失败时返回 0



大多数返回句柄的函数,如OpenProcessOpenFileOpenThreadFindWindow等,在失败时返回0。我知道返回无效结果以指示失败是一种很好的做法。但是,如果Windows选择-1作为INVALID_HANDLE_VALUE,为什么这些函数在失败时不返回-1

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

相关内容

  • 没有找到相关文章

最新更新