为什么大多数与 HANDLE 相关的函数 return 失败时为 0?

Why do most HANDLE related functions return 0 upon failure?

大多数 return 是句柄的函数,例如 OpenProcessOpenFileOpenThreadFindWindow 等,return 0失败后。我了解 return 表示失败的无效结果是一种很好的做法。但是,如果 windows 选择 -1 作为 INVALID_HANDLE_VALUE,为什么这些函数 return -1 在失败时不执行?

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