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

时间:2016-03-21 17:02:16

标签: c windows visual-c++ handle

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

1 个答案:

答案 0 :(得分:2)

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