文档章节

句柄和指针

Amamatthew
 Amamatthew
发布于 2014/06/21 18:41
字数 979
阅读 16
收藏 0
点赞 0
评论 0

句柄是一个32位的整数,实际上是Windows在内存中维护的一个对象内存物理地址列表的整数索引。

因为Windows的内存管理经常会将空闲对象的内存释放掉,当需要访问时再重新提交到物理内存,所以对象的物理地址是变化的,不允许程序直接通过物理地址来访问对象。因此程序就将想访问的对象的句柄传递给系统,系统根据句柄检索自己维护的对象列表就能够知道程序想访问的对象的物理地址了。

因此某种意义上说句柄就是一种指向指针的索引。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是驻留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,Windos是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,以此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果内存总是如此变化,我们该到哪里去找该对象呢?为了解决这个问题,Windows操作系统为各应用程序腾出一些内存地址,用来专门登记各应用对象在内存中的地址变化,而这个地址本身是不会变的。Windows内存管理器移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需要记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。

这个地址是在对象装载时由系统分配的,当系统卸载时又释放给系统。但是,必须注意的是,每次重新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄。而且绝大多数情况下的确不一样。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的座位是一样的道理。

句柄实际上是一种指向某种资源的指针,但与指针又有所不同:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不安全。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄。本质上仍是一个指针,但不要直接操作它,如果要操作该段内存,对于GlobalAlloc创建的可移动的内存,需要配合使用GlobalLock、GlobalUnlock),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。

 C***Dialog* pWnd= (C***Dialog*)FromHandle(hWnd); //由句柄得到对话框的对象指针
 pWnd->xxx( );  //通过指针调用C***Dialog中的函数xxx();


本文转载自:http://blog.csdn.net/feihong247/article/details/8613103

共有 人打赏支持
Amamatthew
粉丝 68
博文 719
码字总数 76443
作品 0
厦门
后端工程师
GetSafeHwnd()和GetSafeHandle()区别

一、GetSafeHwnd()和GetSafeHandle()的主要区别: 1、使用者不同 1)窗体使用 GetSafeHwnd()用于获取窗体的安全句柄(即HWND),有了HWND我们就可以方便的对HWND指向的窗体进行所需的操作了 ...

tomy000 ⋅ 2015/01/07 ⋅ 0

VC中窗口ID,句柄,指针三者相互转换函数

VC中窗口ID,句柄,指针三者相互转换函数 ID--HANDLE--HWND三者之间的互相转换 id->句柄 hWnd = ::GetDlgItem(hParentWnd,id); id->指针 CWnd::GetDlgItem(); 句柄->id id = GetWindowLong(h......

IMGTN ⋅ 2012/07/08 ⋅ 0

Windows数据类型探幽——千回百转你是谁?(1)

indows Data Types Windows数据类型   由微软Windows操作系统所支持的各种数据类型是用来定义函数的返回值、函数和消息的参数以及结构体成员(因为Win32程序是用C语言来编写,所以没有“类...

余二五 ⋅ 2017/11/15 ⋅ 0

浅谈windows句柄表

浅谈windows句柄表 windows定义了很多内核对象:进程对象、线程对象、互斥量对象、信号量对象、事件对象、文件对象等等。在调用相应的函数创建这些对象后,我们都可以通过HANDLE类型的句柄来...

娃哈哈 ⋅ 2013/12/01 ⋅ 0

对象访问定位

句柄访问 jvm栈中的引用类型指向java堆里的句柄池,句柄池指针分别指向对象实例和类型;好处是:引用类型指针永远指向句柄池地址,新的对象创建的时候只是句柄池指针有变化而已; 直接指针访...

清尘V ⋅ 2016/04/28 ⋅ 0

从句柄的概念再看分层设计

几个层次问题,首先物理内存和虚拟内存,操作系统管理物理内存,而用户进程使用虚拟内存,操作系统呈现给用户进程的是连续的虚拟内存但是不一定连续的物理内存,物理内存随时在变化,但是对于...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

Java 对象访问方式

一、句柄访问方式: 使用句柄访问对象,会在堆中开辟一块内存作为句柄池,句柄中储存了对象实例数据(属性值结构体)的内存地址,访问类型数据的内存地址(类信息,方法类型信息), 对象实例...

晨猫 ⋅ 02/16 ⋅ 0

PHP文件操作总结

一、PHP是以UNIX的文件系统为模型的。在*nix上可以有七种文件类型,而在win上只有'file'、'dir'、'unknown'三种类型,在unix上的七种类型如下: 二、PHP文件属性处理函数。 注意:以上函数所...

wddqing ⋅ 2014/03/09 ⋅ 0

AutoCAD_ ID 、指针、句柄和 ads_name的区别

访问实体的特性必须通过对象指针,但是一旦你获得了实体的ID、句柄或者adsname,都能通过ID作中介而获得对象的指针。其中ID是一个桥梁。句柄是Windows编程一个常用的概念,在ObjectARX编程中...

一个小妞 ⋅ 2016/10/17 ⋅ 0

二、虚拟机对象的创建

(一)对象创建的过程 首先尝试在常量池中查找相应类的信息,若查不到则加载类 接下来为对象在堆中分配空间(对象分配的空间大小在类加载是已确定),这里有两种分配方式:在虚拟机内存规整的...

Swimmer ⋅ 2016/11/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

行政区划代码转为字典形式

原数据为: http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/201804-06041553.html 手动替换了一下格式,并使用下面的代码处理. # 输入格式s = """110000:北京市110101:东城区1101...

漫步海边小路 ⋅ 13分钟前 ⋅ 0

android apk 签名

创建key,需要用到keytool.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),把...

国仔饼 ⋅ 22分钟前 ⋅ 0

springcloud+jps+mybatis多数据库配置

多数据库配置 配置我们目录结构设置: config ---datasource ----jpa ----mybatis ----redis Datasource中是数据的相关配置 Jap中是springDatajpa的相关配置 Mybatis中是mybatis的相关配置 ...

大-智-若-愚 ⋅ 29分钟前 ⋅ 0

Spring mvc HandlerMapping 实现机制

概述 当DispatcherServlet接受到客户端的请求后,SpringMVC 通过 HandlerMapping 找到请求的Controller。 HandlerMapping 在这里起到路由的作用,负责找到请求的Controller。 Spring MVC 默认...

轨迹_ ⋅ 32分钟前 ⋅ 0

JavaScript零基础入门——(十)JavaScript的DOM基础

JavaScript零基础入门——(十)JavaScript的DOM基础 欢迎大家回到我们的JavaScript零基础入门,上一节课,我们了解了JavaScript中的函数,这一节课,我们来了解一下JavaScript的DOM。 第一节...

JandenMa ⋅ 今天 ⋅ 0

Weex起步

本教程假设你已经在你的本地环境安装了node 其实weex起步教程在 https://github.com/lilugirl/incubator-weex 项目说明文件中都已经有了,但为了有些同学看到英文秒变文盲,所以这里我重新写...

lilugirl ⋅ 今天 ⋅ 0

Jenkins实践1 之安装

1 下载 http://mirrors.jenkins.io/war/latest/jenkins.war 2 启动 java -jar jenkins.war 前提:安装jdk并配置环境变量 启动结果节选: ************************************************......

晨猫 ⋅ 今天 ⋅ 0

组合数学 1-2000 中,能被6或10整除的数的个数

1--2000 中,能被6或10整除的数的个数 利用集合的性质 能被6整除的个数 2000/6 = 333 能被10整除的个数 2000/10 = 200 能被6和10整除的个数 2000/30 = 66 能被6或10整除的个数 333+200-66 =...

阿豪boy ⋅ 今天 ⋅ 0

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 今天 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部