browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

键歇(3)

Posted by on 2014 年 03 月 24 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

若是你向我问起 Win32 程序设计中最坑爹的印象最深的一个概念是什么,那么我会毫不犹豫地告诉你——句柄(Handles)。究其原因,无论是 MSDN 还是 维基百科,对于“句柄”这个词的解说都显得过于专业,完全是一副气势汹汹、不把初学者吓尿就不罢休的架势。

而这个概念恰恰是入门 Win32 程序设计所要逾越的第一座高山:文件的句柄(HANDLE)、窗口的句柄(HWND)、位图的句柄(HBITMAP)、设备上下文的句柄(HDC)、菜单的句柄(HMENU)、实例的句柄(HINSTANCE)……真可谓如影随形,无处不在。

所以,我决定在这一篇的《键歇》里来为句柄一词重新释义,而且我保证会更通俗、更有文艺范儿。

设计哲学

我必须承认,用“哲学”这个字眼来当作标题是有些大了。其实用大白话来说,就是为什么要设计“句柄”这个东西,以及设计这东西到底有什么好处。

那么让我们把思绪带回到遥远的古代,先。

假设你带领一队拓荒者,你们的目标是在内陆的一个平原上建立你们的村子。现在的情况是,这个地方虽然物产丰饶,但周围并没有类似河流、湖泊这样直接可用的饮用淡水资源,那么你会怎么办?

——当然是打口井了。

好办法!但接下来的问题又来了:

这是一口 10 米深的井,你将如何解决饮水的问题?毕竟,下到井底直接喝水不仅费时费力,而且存在着一定的危险性。

这个问题的确稍显脑残,因为我们的祖先早已发明了一件神奇的辅助工具来解决这个问题。这件工具也就是为我们所熟知的辘轳,如下图。

这张图出自明人宋应星所著的《天工开物》一书,其中示意了辘轳的结构及其使用方法。好了,现在让我们从程序员的视角来做一些有趣的分析,也就是刚才提到过的所谓“设计哲学”——当然,是关于辘轳的。

  • 在整个打水的过程中,打水者并不需要关心整个水井的实现,也不需要关注辘轳运作的内部机制。在这个“黑箱”形成后,他唯一要做的只是转动手柄,仅此而已。
  • 由于借助了辘轳,取水者不必直接面对水井的底层——也就是深不可测的井水,这样大大降低了打水的危险系数。

定义

我相信,这么说应该能够让你理解辘轳上的那个手柄的意义了。鉴于英语中的手柄和句柄是同一个单词“handle”,那么我觉得“句柄”一词的定义也可以给出来了:

所谓句柄,就是指在某些情况下我们出于易用性和安全性的考虑,为了隐藏真正数据对象的实现而对其进行某种方式的绑定或映射后最终得到并使用的描述符。

补充说明

走笔至此,我觉得还有必要说上几句。本篇《键歇》的内容实际上是从我那本《Windows 编程札记》的第二章中摘选出来的。在那一名为《句柄》的章节之中,除了以上我所写到的有关句柄的设计哲学和释义,还包括了以下内容:

  • EPROCESS 中的句柄表
  • 三层句柄表(Win2000)及动态句柄表(WinXP+)的结构
  • USER 句柄及 GDI 句柄
  • 模块句柄(HMODULE)
  • 进程/模块快照句柄

不过,在考虑再三之后,我做出了一个艰难的决定——把这些占据了大段篇幅的文字全部砍掉了。虽然觉得有些可惜,但既然我所要重点描写的是句柄设计哲学中将实现进行隐藏的理念,那么于下文中再把这些实现挖出来则不免显得有些讽刺了。另,这些内部实现的实用与重用价值有待商榷,孟浪写出恐徒增笑耳,故不取之。

订阅本站

3 Comments

  • At 2014.03.26 12:22, ted said:

    辘轳的比喻大赞 !

    • At 2014.08.02 17:13, smtp1918 said:

      曾被句柄吓的屁滚尿流,直接转行搞网络去了。

      • At 2014.11.22 11:30, 刀刀 said:

        有点意思.

        (Required)
        (Required, will not be published)