一、INVALID_HANDLE_VALUE 

1、源码

//    WinNT.h
typedef void *HANDLE;
//    BaseTsd.h
typedef _W64 long LONG_PTR, *PLONG_PTR;
//    WinBase.h
#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)

2、解析

(1)HANDLE实际上是void指针类型,-1经过(HANDLE)(LONG_PTR)之后,转成了0xffffffff。

(2)原因:

-1的二进制为1000 0000 0000 0000 0000 0000 0000 0001,但数据在内存中是以补码形式存在的,故内存中存储的数据为1111 1111 1111 1111 1111 1111 1111 1111,按照void*去读取时,该值的结果为:0xffff ffff 了。
 

二、三者的联系

释放句柄时,会调用函数

BOOL WINAPI CloseHandle(__in HANDLE hObject);

是该函数仅仅释放掉句柄对应的内核对象,其本身的值没有变化,故需要将其复位,这里就用到了INVALID_HANDLE_VALUE 。其实其用法与释放指针时为了避免“野指针”的存在,将指针赋值NULL、nullptr的方法是一样的。