参考链接:https://zh.wikipedia.org/wiki/%E5%8F%A5%E6%9F%84
https://www.zhihu.com/question/27656256

句柄(HANDLE)是什么?

维基百科:

在程序设计中,句柄(handle)是 Windows 操作系统用来标识被应用程序所创建或使用的对象的整数。其本质相当于带有引用计数的智能指针。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,可以使用句柄。

知乎上比较简短而有趣的回答有:

如果当初把 handle 这个词翻译成"编号",那得省大家多少事啊。

文件编号
窗口编号

太容易理解了
一个古怪的词汇,句柄,不知道吓退了多少学习 windows 编程的人

另外一个回答:

最早的 windows 开发书籍,handle 是被翻译成“把手”的。虽然不好听,但是个人认为相当传神。

1.虽然你握住的只是把手,却能拉动整扇门,而且你根本不用在意那门长什么样子
2.一扇门如果有多个把手,被不同的人(进程)握住,门往哪儿走就不好说了

比较专业的回答:

句柄就是个数字,一般和当前系统下的整数的位数一样,比如 32bit 系统下就是4个字节。
这个数字是一个对象的唯一标示,和对象一一对应。这个对象可以是一个块内存,一个资源,或者一个服务的 context(如 socket,thread)等等。
这个数字的来源可以有很多种,只要能保证和它代表的对象保持唯一对应就可以,比如可以用内存地址,也可以用句柄表的序号,或者干脆用一个自增 ID,再或者用以上的值去异或一个常数。传统上操作系统内核和系统服务 API 都是 C 语言接口的,但是其内部设计理念上又是 OO (面向对象)的,所以有对象概念却没有对应的语言语法支持。
句柄的作用就是在 C 语言环境下代替 C++ 的对象指针来用的。创建句柄就是构造,销毁句柄就是析构,用句柄调用函数相当于传入 this 指针。如果有系统 API 是 C++ 接口的,那么就没有句柄了,而是某个接口指针,IXXXPtr 之类的,比如 Windows 的 com ptr。

查了这几个资料,大概说的比较清楚了,我也不多加赘述。

另外,Windows.h 对 HANDLE 类型的定义,还真就是指针:

typedef HANDLE *void