什么是句柄

原创 2013年12月02日 21:33:15
    在Windows环境中,句柄是用来标识 项目的,这些项目包括: 
    *.模块(module) 
    *.任务(task) 
    *.实例(instance) 
    *.文件(file) 
    *.内存块(block of memory) 
    *.菜单(menu) 
    *.控制(control) 
    *.字体(font) 
    *.资源(resource),包括图标(icon),光标(cursor),字符串(string)等 

    *.GDI对象(GDI object),包括位图(bitmap),画刷(brush),元文件 (metafile),

              调色板   (palette),画笔(pen),区域(region),以及设备描述表(device context)。 

     WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的, 相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。 、

   句柄是WINDOWS用 来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。 

    从上面的2个定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的, 它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名 字和你一样的人。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他 的WINDOWS函数就可以使用该句柄,以引用相应的对象。WINDOWS编程中会用到大量的 句柄,比如:HINSTA NCE  (实例句柄),HBITMA P  (位图句柄),HDC  (设备描述表句 
柄),HICON  (图标句柄)等等,这当中还有一个通用的句柄,就是HA NDLE,比如下面的语 句: 
    HINSTA NCE hInstance ; 
    可以改成: 
    HA NDLE hInstance ; 
    上面的2句语句都是对的。 


     句柄是一个标识符,是拿来标识对象或者项目的。应用程序几乎总是通过调用一个 WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应 的对象。 
   如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知 道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如 果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道Windows是一个以虚拟内存为  基础的操作系统。在这种系统环境下,Windows 内存管理器经常在内存中来回移动对象,依此 
  来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变 
  化,我们该到哪里去找该对象呢?  
    为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记 各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows 内存 管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只 需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载  (Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。 
    注意: 
    内核对象句柄,是用来标识某个内核对象的一个id 
    同一个对象的该id对于每个进程是不同的,具体如何实现是ms不公开的算法,以下是一个 
  近似的,可能的算法: 
    进程创建时,windows系统为进程构造了一个句柄表 
    当该进程希望获得一个内核对象句柄或者创建一个内核对象从而获得该对象句柄时 系统会将在句柄表中增加一个表项,表项的内容中存储了指向目标内核对象的指针 同时,系统返回这个表项在句柄表中的索引作为句柄 

HTML中的事件句柄

很多动态性的程序都定义了事件句柄,当某个事件发生时,Web浏览器会自动调用相应的事件句柄。由于客户端JavaScript的事件是由HTML对象引发的,因此事件句柄被定义为这些对象的属性。例如,要定义在...
  • confirmAname
  • confirmAname
  • 2013年06月06日 22:57
  • 1822

Linux 句柄是什么 ?

1.句柄就是一个标识符,只要获得对象的句柄,我们就可以对对象进行任意的操作。 2.句柄不是指针,操作系统用句柄可以找到一块内存,这个句柄可能是标识符,map的key,也可能是指针,看操作系统怎么...
  • GoOnDrift
  • GoOnDrift
  • 2014年01月29日 16:49
  • 2091

什么是句柄什么是句柄对象

对象(object): 是一件事、一个实体、一个名词,可以获得的东西,可以想象有自己的标识的任何东西。对象是类的实例化。一些对象是活的,一些对象不是。比如这辆汽车、这个人、这间房子、这张桌子、这株植...
  • u010236550
  • u010236550
  • 2014年04月26日 21:34
  • 2945

JAVA中的术语:句柄是啥意思

句柄的本质:一个唯一的整数,作为对象的身份id,区分不同的对象,和同类中的不同实例。程序可以通过句柄访问对象的部分信息。句柄不代表对象的内存地址。 句柄和指针的区别:程序不能通过句柄直接阅读文件中的...
  • u012536353
  • u012536353
  • 2015年12月29日 18:03
  • 2475

句柄和指针的区别(php资源类型)

群里有人问,你这个博客叫  lnmp,是专注于php的,为啥要有这篇文章了?我们知道在php中,至少在编码时,programmer是不会显实的去操作指针的,更何况句柄,有的人甚至都不知句柄为何物?我给...
  • yipiankongbai
  • yipiankongbai
  • 2013年12月18日 22:41
  • 2975

句柄和指针的区别和联系

所谓 句柄实际上是一个数据,是一个Long (整长型)的数据。句 柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位...
  • ghevinn
  • ghevinn
  • 2014年07月16日 14:02
  • 3220

句柄泄露实例分析

在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我们有一个句柄泄露的例子。例子中多次创建和Dispose了DataReceiver和DataAnalyzer对象,...
  • zhjmyx
  • zhjmyx
  • 2016年12月16日 16:51
  • 974

获取窗口的句柄方法总结

 句柄获取方法(获取该窗口的句柄后,即可向该窗口类类发送消息、处理程序): 例如:::PostMessage("句柄", WM_USER_DRAWVIEWPIC_EDS, 0, 0); ...
  • ljsant
  • ljsant
  • 2016年07月09日 08:58
  • 1074

句柄、引用、指针与对象

首先要分清是在什么地方讨论,在以前学C时,是这么区分: (1)指针是对象在内存中的地址; (2)引用是对象的别名,其实质就是功能受限但是安全性更高的指针; (3)句柄是指针的指针,句柄实际上是一...
  • jxiao_11
  • jxiao_11
  • 2016年04月15日 09:24
  • 1506

谈”句柄泄漏”

小武哥发表评论阅读评论 “泄漏”是我们写程序的人老生常谈的一个话题。最为常见的就是内存泄漏(memory leak),本文介绍一种新的泄漏—句柄泄漏(handle leak)。在windows...
  • modiziri
  • modiziri
  • 2015年11月19日 15:35
  • 1208
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:什么是句柄
举报原因:
原因补充:

(最多只允许输入30个字)