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