handle句柄
若是你向我问起 Win32 程序设计中印象最深(最坑爹)的一个概念是什么,那么我会毫不犹豫地告诉你——句柄(Handles)。究其原因,无论是 MSDN 还是 维基百科,对于“句柄”这个词的解说都显得过于专业,完全是一副气势汹汹、不把初学者吓尿就不罢休的架势。
而这个概念恰恰是入门 Win32 程序设计所要逾越的第一座高山:文件的句柄(HANDLE)、窗口的句柄(HWND)、位图的句柄(HBITMAP)、设备上下文的句柄(HDC)、菜单的句柄(HMENU)、实例的句柄(HINSTANCE)……真可谓如影随形,无处不在。
设计哲学
我必须承认,用“哲学”这个字眼来当作标题是有些大了。其实用大白话来说,就是为什么要设计“句柄”这个东西,以及设计这东西到底有什么好处。
那么让我们把思绪带回到遥远的古代,先。
假设你带领一队拓荒者,你们的目标是在内陆的一个平原上建立你们的村子。现在的情况是,这个地方虽然物产丰饶,但周围并没有类似河流、湖泊这样直接可用的饮用淡水资源,那么你会怎么办?
——当然是打口井了。
好办法!但接下来的问题又来了:
这是一口 10 米深的井,你将如何解决饮水的问题?毕竟,下到井底直接喝水不仅费时费力,而且存在着一定的危险性。
这个问题的确稍显脑残,因为我们的祖先早已发明了一件神奇的辅助工具来解决这个问题。这件工具也就是为我们所熟知的辘轳,如下图。


这张图出自明人宋应星所著的《天工开物》一书,其中示意了辘轳的结构及其使用方法。好了,现在让我们从程序员的视角来做一些有趣的分析,也就是刚才提到过的所谓“设计哲学”——当然,是关于辘轳的。
- 在整个打水的过程中,打水者并不需要关心整个水井的实现,也不需要关注辘轳运作的内部机制。在这个“黑箱”形成后,他唯一要做的只是转动手柄,仅此而已。
- 由于借助了辘轳,取水者不必直接面对水井的底层——也就是深不可测的井水,这样大大降低了打水的危险系数。
定义
我相信,这么说应该能够让你理解辘轳上的那个手柄的意义了。鉴于英语中的手柄和句柄是同一个单词“handle”,那么我觉得“句柄”一词的定义也可以给出来了:
所谓句柄,就是指在某些情况下我们出于易用性和安全性的考虑,为了隐藏真正数据对象的实现而对其进行某种方式的绑定或映射后最终得到并使用的描述符。
handle句柄的更多相关文章
- code of C/C++(3) - 从 《Accelerated C++》源码学习句柄类
0 C++中多态的概念 多态是指通过基类的指针或者引用,利用虚函数机制,在运行时确定对象的类型,并且确定程序的编程策略,这是OOP思想的核心之一.多态使得一个对象具有多个对象的属性.class Co ...
- VC一些经验系列: 《分享泄漏检测工具:内存、DC、GDI、Handle... 》
分享下自己工作中用到的一些用于泄漏检测的工具 后面的是DC的一些定义和注意事项.(不喜勿看) //=================================================== ...
- delphi 句柄
句柄Handle顾名思义就是把柄,把手的意思 ,得到了某对象的句柄可以任意控制此对象 .句柄是一种指向指针的指针.不是每个组件都有句柄,只有窗口控件等(*.模块(module)*.任务(task)*. ...
- c++沉思录 学习笔记 第六章 句柄(引用计数指针雏形?)
一个简单的point坐标类 class Point {public: Point():xval(0),yval(0){} Point(int x,int y):xval(x),yval(y){} in ...
- 用Windows Native API枚举所有句柄及查找文件句柄对应文件名的方法
枚举所有句柄的方法 由于windows并没有给出枚举所有句柄所用到的API,和进程所拥有的句柄相关的只有GetProcessHandleCount这个函数,然而这个函数只能获取到和进程相关的句柄数,不 ...
- 【旧文章搬运】Windows句柄表分配算法分析(一)
原文发表于百度空间,2009-03-30========================================================================== 阅读提示: ...
- Windows中句柄和ID的区别
写在前面:这里介绍句柄 对于“句柄”,在下一直停留在一知半解的认识层面,近日在下学习Windows编程,决定趁此机会将句柄彻底搞清楚.查阅了一些网络上的资料,发现网络上的讲解大概可以分为两类:一种是以 ...
- 获取句柄的类型以及对应的ID序号
遍历所有进程下的所有句柄,以及对应句柄类型. 一丶简介 在有的时候.我们会需要对应句柄名字.以及句柄类型的名称. 以及它所对应的的ID. 因为每个系统不一样.所以每次都是不一样的. 有的时候我们就需要 ...
- DuplicateHandle 伪句柄 与 实句柄的应用
如果把GetCurrentThread()返回值传递给一个HANDLE句柄,用它进行ResumeThread,结果肯定不是我们想要的.下面的例子详细描述了伪句柄的调用结果: #include &quo ...
随机推荐
- 对于不返回任何键列信息的 SelectCommand,不支持 DeleteCommand 的动态 SQL 生成
VS新增操作数据库出现如下报错. 原因是数据库表未添加主键 MySQL: CREATE TABLE Customer (SID integer, Last_Name ), First_Name ), ...
- bat脚本输出日志
一,bat脚本常用的的输出命令是“echo 输出内容”,可以利用echo将文本输出到cmd窗口或文件.bat脚本是不区分大小写的脚本语言,因此大小写都可以. 例如: REM 在命令行窗口输出 echo ...
- Django框架 --序列化组件(serializer)
一 .Django自带序列化组件 Django内置的serializers(把对象序列化成json字符串) from django.core import serializers from djang ...
- [PHP] 项目实践中的自动加载实现
1.使用spl_autoload_register函数注册一个自己定义的自动加载函数2.当在代码中new一个不存在的类的时候,上面的函数会被调用,不存在的类名会被作为参数传入该函数中3.兼容了两种方式 ...
- C++编译错误 --- 成员函数定义在 .h 文件中出现重定义错误(Error LNK 2005)
今天写了一个简单的类,定义在 .h 文件中, 类很简单就将其成员函数定义在了一起(class类后面).运行的时候出现了如下图所示的编译错误(error LNK2005) 查资料,大部分都是说需要加上 ...
- 商学院教授点评亚马逊、苹果、Facebook和谷歌的商业策略:3星|《互联网四大:亚马逊、苹果、脸书和谷歌的隐藏基因》
“ 谷歌依靠时报的内容吸引了数十亿点击量,而时报使用它们的搜索算法来引入流量.但是两者中显然谷歌拥有更大的权力.它如同地主一样统治着互联网的一个关键领域,而时报就相当于那块草地上的佃农.我们的结局从一 ...
- 2019第一期《python测试开发》课程,10月13号开学
2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...
- 0.Jenkins 介绍
一.持续集成的概念 continuous intergaration (简称CI),持续集成. 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味 ...
- JAVA并发-CountDownLatch
源码: 内部类Sync private static final class Sync extends AbstractQueuedSynchronizer { private static fina ...
- JDOJ 1775: 求N!中0的个数
JDOJ 1775: 求N!中0的个数 JDOJ传送门 Description 求N!结果中末尾0的个数 N! = 1 * 2 * 3 ....... N Input 输入一行,N(0 < N ...