C++中的句柄

这个句柄只是从英文handle翻译过来的,只问句是什么意思难以解释,这个是我从别人的空间收集的信息,

功能上的理解:

什么是"句柄"(handle),handle的本意是把柄,把手的意思。是你与操作系统打交道的东东。

举个通俗的例子,比如你考上了大学,入学后,学校(操作系统)会给你一个学生证号。

注意,这个号码是学校指定的,你无法自选。

有了这个号码(学生证,假设一证多用)享受学校提供的服务:

如你就可以去图书馆借书,去食堂吃饭,去教室上课等等。

但你不能到食堂里买啤酒,因为学校不允许这种服务。

而在计算机中系统提供的服务就是API调用,你有了HANDLE,就可以理直气壮地向系统提出调用API的服务。

而指针的权力就大多了,有了指针你可以到处去喝酒,打架,学校(操作系统)管不着,

所以句柄和指针的区别在于句柄指针调用系统提供的服务。

而句柄虽然是一个能相互区别的号码,但与我们普通的ID号又有区别,

普通的ID号是可以由程序员自己定义的,而句柄不行,它是对象生成是系统指定的,

是为了区别系统中存在的各个对象,这个句柄不是由程序员符给的。

概念上的理解

1。句柄,是整个windows编程的基础,一个句柄是指使用的一个唯一的整数值,

是指一个四字节长的数值,用于标志应用程序中的不同对象和同类对象中的不同的实例,

诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。

应用程序能够通过句柄访问相应的对象的信息。

2。句柄不是一个指针,程序不能利用它句柄来直接阅读文件中的信息。

如果句柄不用在I/O文件中,它是毫无用处的。

3。句柄是windows用来标志应用程序中建立的或是使用的唯一整数,

windows使用了大量的句柄来来标志很多对象。

机制上的理解

前面的分析很经典,但我认为有一点必须指出的。如果不对,请各位指证。

句柄是指针,一点不假,但是这个指针又与C中的指针有不同之处。

因为Windows是一个多任务的系统,其内存是可以移动的,

这样的话如果某一时刻有一个指针指向一块内存,之后的某个时刻却被系统移走了,

如果你再用这个指针的话就会出错。

为了解决这一问题,windows在系统专区开一块内存用于存放句柄,这个句柄的值就是一个地址,

当这一块内存被移走后,windows就修改这个句柄的值,再访问这块内存时,句柄的值总是有效的。

正因为这样当你使用GlobalAlloc分配的内存时,如果你指定这块内存的属性是固定的,

那么它的返回值可以直接给一个指针,如果是可以移动的,

返回值就必须给一个句柄,你就必须先GlobalLock后才能使用。

这是我对句柄理解,不知道对不对?

我的理解

其实,句柄是一个指向指针的指针。即:

在windows程序设计中,句柄仅是一个应用程序用来识别某些事情的数字

如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。

我们知 道,所谓指针是一种内存地址。

应用程序启动后,组成这个程序的各对象是住留在内的 。

如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。

但是,如果您真的这样认为,那么您就大错特错了。

我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,

Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。

对象被移动意味着它的地址变化 了。如果地址总是如此变化,我们该到哪里去找该对象呢?

为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,

用来专门 登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。

Wi ndows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。

这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。

这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统 。

句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地址(不稳定) →实际对象

但是,必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是

原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成

是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电

影院售给我们的门票总是不同的一个座位是一样的道理。

句柄C++的更多相关文章

  1. JavaScript权威设计--事件冒泡,捕获,事件句柄,事件源,事件对象(简要学习笔记十八)

    1.事件冒泡与事件捕获 2.事件与事件句柄   3.事件委托:利用事件的冒泡技术.子元素的事件最终会冒泡到父元素直到跟节点.事件监听会分析从子元素冒泡上来的事件. 事件委托的好处:     1.每个函 ...

  2. Nodejs事件引擎libuv源码剖析之:句柄(handle)结构的设计剖析

    声明:本文为原创博文,转载请注明出处. 句柄(handle)代表一种对持有资源的索引,句柄的叫法在window上较多,在unix/linux等系统上大多称之为描述符,为了抽象不同平台的差异,libuv ...

  3. C#根据句柄改变窗体控件值

    需求是这样,有个程序界面我们需要通过自己的程序持续输入数据,界面如图. 可以获得控件的句柄而用钩子写入值.这里需要用到spy++工具.在VS的工具下有个spy++工具,打开如下图 通过这个工具可以获得 ...

  4. .NET对象与Windows句柄(一):句柄的基本概念

    在.NET编程中,得益于有效的内存管理机制,对象的创建和使用比较方便,大多数情况下我们无须关心对象创建和分配内存的细节,也可以放心的把对象的清理交给自动垃圾回收来完成.由于.NET类库对系统底层对象进 ...

  5. 源码剖析——深入Windows句柄本质

    参考资料: 1. http://www.codeforge.cn/read/146318/WinDef.h__html windef.h头文件 2. http://www.codeforge.cn/r ...

  6. 图解说明——究竟什么是Windows句柄

    图解说明——究竟什么是Windows句柄 参考资料:http://blog.csdn.net/newjerryj/article/details/4383701 http://www.cnblogs. ...

  7. code of C/C++(3) - 从 《Accelerated C++》源码学习句柄类

    0  C++中多态的概念 多态是指通过基类的指针或者引用,利用虚函数机制,在运行时确定对象的类型,并且确定程序的编程策略,这是OOP思想的核心之一.多态使得一个对象具有多个对象的属性.class Co ...

  8. matlab初学之句柄

    文章出处:http://www.cnblogs.com/CBDoctor/archive/2012/04/06/2434072.html 在matlab中,每一个对象都有一个数字来标识,叫做句柄.当每 ...

  9. c++句柄设计

    句柄,也称为智能指针. 我计算了一下我的时间,以后每14天得读完一本书,才不愧对我买的这么多书.然而我还要抽出时间来谢谢博文.最近读的是c++沉思录,开篇就用了3章来讲述句柄.好了,废话少说,接下来谈 ...

  10. Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄(转)

    用我的方法来控制其他程序窗体上的窗口控件,必须先了解什么是 回调函数.我的理解是这样的: 回 调函数写出来不是自己的程序去调用的,反而是让其他的东西去调用,比如windows操作系统,比如其他的程序等 ...

随机推荐

  1. JMM内存管理

    原文地址http://www.cnblogs.com/BangQ/p/4045954.html 原本准备把内存模型单独放到某一篇文章的某个章节里面讲解,后来查阅了国外很多文档才发现其实JVM内存模型的 ...

  2. XAMPP 的MYSQL无法启动

    最近在学习小程序,小程序的后台cms系统需要安装XAMPP软件,这个软件是个集成软件,里面有MySql 和 Apache 等 ,首先进入小程序后台时需要启动MySql 和 Apache Apache ...

  3. IOC(控制反转)

    一.容器与Bean 在Spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean. 简单地讲,bean就是由Spring容器初始化.装配及管 ...

  4. 不容忽略的——CSS规范

    一.CSS分类方法: 公共型样式 特殊型样式 皮肤型样式 并以此顺序引用 <link href="assets/css/global.css" rel="style ...

  5. js--javascript中字符串常用操作总结、JS字符串操作大全

    字符串的操作在js中非常频繁,也非常重要.以往看完书之后都能记得非常清楚,但稍微隔一段时间不用,便会忘得差不多,记性不好是硬伤啊...今天就对字符串的一些常用操作做个整理,一者加深印象,二者方便今后温 ...

  6. HDU 2212 DFS

    Problem Description A DFS(digital factorial sum) number is found by summing the factorial of every d ...

  7. javascript基础(三)运算

    原文http://pij.robinqu.me/ 递增递减操作符(包括前置和后置).一元正负符号操作符 这些操作符适用于任何数据类型的值,针对不同类型的值,该操作符遵循以下规则(经过对比发现,其规则与 ...

  8. 修改win7锁定界面背景

    Regedit HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Authentication/LogonUI/Backgrou ...

  9. 安卓---高德地图API应用

    说明:定位需要导入android_location 的jar包,如果没有会报错,这个官方网站好像找不到,这是我在网上找到的一个链接 http://download.csdn.net/detail/ra ...

  10. Hadoop之初体验

    首先是来说一下这两天来自己的个人感受吧.我争取在第一段将情怀给逼逼完,大家可以无视这一段~~~真心是不容易,第一个感觉就是,乱.为啥呢?先说说我使用Hadoop的原因吧.选了云计算这门课,打算到时候深 ...