大多数返回句柄的函数,如OpenProcess
、OpenFile
、OpenThread
、FindWindow
等,在失败时返回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