句柄(200分)

  • 主题发起人 主题发起人 newart
  • 开始时间 开始时间
N

newart

Unregistered / Unconfirmed
GUEST, unregistred user!
我是个爱好者,我知道句柄是事件的名称,是不是每个事件都具有句柄,
能不能详细地向我讲述一下句柄的概念和相关的方法?什么时候应该用这个代名词?
请说简练一些!!!
我先谢了!!!
 
句柄并不是事件的名称,它是一个 windows 的概念,
windows 是通过发消息来控制程序的运行的,句柄就是 windows 中可以接受消息的对象
(包括控件,进程,线程,GDI 资源等等)的唯一标识,
windows 内部维护了一个句柄列表,它把相关资源和这个句柄表联系在一起来管理。
 
什么是句柄?

句柄就是用来区分各种内存对象的唯一标识符号,是个32位整数。
有些是整个系统唯一(如窗口句柄),有些是当前进程或线程中唯一
(如线程句柄,全局的有另一个标识符)。
详细的可分为许多种,都是以H开头的。在VB中使用时全部都用Long。
常见的有窗口句柄(HWND),设备描述表句柄(HDC),内存句柄(HMEM),
文件句柄,进程句柄,线程句柄,笔的类型句柄(HPEN),字体句柄(HFONT),
区域句柄(HRGN)等等。
在申请句柄时是要占用资源的,分三类SYSTEM、USER、GDI。
而WINDOWS的资源是固定的,并不随内存的扩大而扩大,所以使用完以后一定要释
放。
如果只用VB本身的代码一般是不会用到句柄的,但要是使用API函数的话,
大多数会使用。
补充几点:
再Windows系统中,句柄(我一直觉得这个词翻译得特别别扭)分为三大类:Kernel
Handle、User Handle和应用程序自定义的Handle。
Kernel Handle实际上是进程内Kernel对象的指针表索引,Kernel对象包括进程、文
件、信号等。但是MS为了掩盖着一事实,在系统启动时生成了一个所谓Obsfucator的值
(其实应该是Obfuscator,Microsoft Bugs(R) :),生成Handle后将Handle与这个值异
或后返回给应用程序,所以看到的Handle都是一些很大而且毫无意义的数字。这些
Handle和索引的对象是由KRNL32.DLL和VMM32.VXD共同管理的,所以称之为Kernel
Handle。
User Handle是用来标示窗口、DC等对象的,他们是真实的指针,但指向的并不是对象
的开头,有一个偏移量。同样,这些对象是由USER32.DLL管理的。
第三种Handle不过是应用程序自定义的一些索引之类的东东,具体的意义和应用程序相
关。
 
谢了,我们学习的激情是被大家所鼓励出来了,我很满意!以后还要多请教!!
 
后退
顶部