句柄和指针【英国某著名计算及图形面试题】

    句柄是一个32位的整数(uint),实际上是Windows在内存中维护的一个对象(窗口等)内存物理地址列表的整数索引。因为Windows的内存管理常常把当前空闲对象的内存释放掉,当需要访问时候再重新提交到物理内存,所以对象的物理地址是变化的,不允许程序直接通过物理地址直接访问对象。程序将想要访问对象的句柄传递给系统,系统根据句柄检索自己维护的对象列表,就能知道程序想访问的对象和其物理地址。

   句柄是指针的指针。我们知道所谓指针是一种内存地址。应用程序启动后,组成这个程序的各个对象时驻留在内存的。如果简单的理解,似乎只要知道内存地址,我们就可以随时访问对象。但这是错误的!我们知道windows是一个已虚拟内存为基础的操作系统。在这种系统环境下,windows内存管理器经常在内存中来回移动对象,以此满足各种应用内存的需要。对象被移动意味着它的内存地址发生了改变。那我们该去哪里找到对象呢?为了解决这个问题,Windows为各个应用程序腾出一些内存地址,用来专门登记各应用对象在内存地址中位置的变化,而这个地址(存储单元位置)本身是不变的。Windows内存管理器移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存,这样我们只需要记住这个句柄地址,我们就可以间接的知道对象具体在内存的哪个位置。这个地址是在对象装载(Load)时由系统分配的,当系统卸载(Unload)时又释放给系统。句柄地址(稳定)—>记载着对象在内存中的地址—>对象在内存中的地址(不稳定)—>实际对象。但是,必须注意的是,系统重新启动后,不能保证分配给这个程序的句柄还是原来的那个句柄,而且大多数情况下都不是原来的句柄。

    HDC是设备描述表句柄。CDC是设备描述表类。用GetsafeHwnd和Fromhandle可以互相转换。其他内容可以访问http://www.cnblogs.com/wangliang651/archive/2007/05/16/748926.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值