句柄和指针有何区别

句柄是不同于指针的,但是实际上的操作有想通的地方。创建一个窗体,或者创建DC、BITMAP……都会有相应的句柄产生。那么这些对象销毁的时候,他们对应的句柄也就失效了。或者说可以通过他们的句柄来销毁这些对象。

句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址 访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化 了。如果地址总是如此变化,我们该到哪里去找该对象呢?为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门 登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地址(不稳定)→实际对象。但是,必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成 是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电 影院售给我们的门票总是不同的一个座位是一样的道理。

HDC是设备描述表句柄。

CDC是设备描述表类。

用GetSafeHwnd和FromHandle可以互相转换

指针可以当句柄

句柄不一定都是指针

句柄只是代表某一个对象的一个数字

根据这个数字可以通过某种关系找到这个对象

指针是一个对象的地址

::ReleaseDC();

这句话是释放HDC的句柄,还是释放HDC句柄所指的内存?

DC是设备上下文,用起来就像一根可以换笔蕊的笔壳.

是不是只有某些对像有句柄?

int i;

int* p=&i;

他的内存不会改变吧

句柄简而言之就是指向结构的指针。

::ReleaseDC();

int ReleaseDC(

 HWND hWnd, // handle to window

 HDC hDC     // handle to device context

);

 

The application must call the ReleaseDC function for each call to the GetWindowDC function and for each call to the GetDC function that retrieves a common device context

获取某个系统对dc的一个引用有个计数器::GetDC(); 时计数器+1 ::ReleaseDC();时计数器-1,否则某些东西不能正确释放掉。

 

 

 

 

 

 

 

 

 

文章原文http://www.cnblogs.com/wangliang651/archive/2007/05/16/748926.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值