HANDLE类型返回值的不确定性指的是Windows API函数的返回值为HANDLE类型时,有两种表示失败的方式:

  • HANDLE == NULL,如CreateEvent等
  • HANDLE == INVALID_HANDLE_VALUE,如CreateFile等

其中,NULL的值始终为0,而INVALID_HANDLE_VALUE的值为-1,其在32位和64位程序中分别等于0xFFFFFFFF0xFFFFFFFFFFFFFFFF

具体哪些函数失败时返回NULL,哪些返回INVALID_HANDLE_VALUE了?这个需要查阅MSDN文档来确定。

为什么会出现这两种情况了?

根据Windows强大的兼容性,我们不能猜测出这么做是为了向前兼容,为了兼容以前的16位程序,所以一直没有改变。

在16位程序中无效的HANDLE值为INVALID_HANDLE_VALUE,在16位程序中-1为0xFFFF,而到了32位(或64位)时代,-1则为0xFFFFFFFF(或0xFFFFFFFFFFFFFFFF)。

所以我们在判断HANDLE是否合法时,要特别留意,需要根据API的不同来做不同的判断。

需要注意

GetCurrentProcess()用于获取当前进程的伪句柄,当前进程的伪句柄值是-1,恰好与INVALID_HANDLE_VALUE值相等。

因此用 WaitForSingleObject 等待 INVALID_HANDLE_VALUE 也就是等同于等待当前进程结束。