文档章节

句柄和指针

Amamatthew
 Amamatthew
发布于 2014/06/21 18:41
字数 979
阅读 16
收藏 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
博文 1050
码字总数 76443
作品 0
厦门
后端工程师
GetSafeHwnd()和GetSafeHandle()区别

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

tomy000
2015/01/07
0
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
0
Windows数据类型探幽——千回百转你是谁?(1)

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

余二五
2017/11/15
0
0
Java 对象访问方式

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

晨猫
02/16
0
0
对象访问定位

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

清尘V
2016/04/28
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring 容器实现对bean的管理(注解方式解析,源码阅读)

因为最近在研究学习spring boot,所以这里想详细学习回顾了一下spring 容器对bean的一些管理方式和部分源码学习。 首先初始类AnnotationConfigApplicationContext,简单源码查看,支持两个参...

小海bug
18分钟前
0
0
数据结构:二分查找 java

二分查找的前提是有序存储,利用顺序存储和元素排序 /** * 二分查找,查找成功,返回下标记 * @param values * @param begin * @param end * @param key * @param <T> * @ret...

京一
36分钟前
0
0
@SpringBootApplication 注解

@SpringBootApplication注解是一个组合注解,包含以下注解 @Target(ElementType.TYPE) 注解的作用目标 @Retention(RetentionPolicy.RUNTIME) Reteniton的作用是定义被它所注解的注解保留多久,...

java.刘
49分钟前
0
0
sentinel自定义DataSource实战

序 本文主要研究一下如何自定义sentinel的DataSource,这里以jdbc为例。 maven <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sen......

go4it
今天
1
0
xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和Decisio...

tantexian
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部