Handle(句柄)是底是个什幺东东???(50分)

  • 主题发起人 主题发起人 rolinyang
  • 开始时间 开始时间
R

rolinyang

Unregistered / Unconfirmed
GUEST, unregistred user!
Handle(句柄)是底是个什幺东东???
 
在窗口系统中的对象标识。
 
Handle是一个32位的数字,Windows用这个数字来代表和管理各种资源,如窗口,文件,进程等。
 
受M$的帮助文档以及很多Windows编程书籍的影响,大家对局柄比较普遍的认识是:句柄
是一个整数,用以标识Windows对象,句柄不是一个指针……

而实际上,这些不过是M$进行数据封装的幌子而已,下面我们一起来分析一下HANDLE到底
是什么。

请先到Windef.h找绝大多数句柄的定义:
DECLARE_HANDLE(HWND);
DECLARE_HANDLE(HHOOK);
……
DECLARE_HANDLE(HGDIOBJ);
DECLARE_HANDLE(HBITMAP);
DECLARE_HANDLE(HBRUSH);
……
typedef HANDLE HGLOBAL;
typedef HANDLE HLOCAL;
……

OK, 现在大家跟我一起翻到Winnt.h,看看DECLARE_HANDLE和HANDLE到底是什么:
#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; };
typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
typedef HANDLE *PHANDLE;

哈哈,现在知道了吧,HANDLE就是PVOID,也就是无类型指针,
而DECLARE_HANDLE(HWND);就是:
struct HWND__ {
int unused;};
typedef struct HWND__ *HWND;
现在实际上都清楚啦,这些Handles都不过是指向struct的指针,至于这个struct的用处,
连M$都说unused了,^o^

现在解释下M$这么做的意义,这就是所谓数据封装,你可以在你的程序中把M$的内部结
构指针传来传去,可是你却不知道它到底指向的内容是什么,而且可以编个句柄的瞎话
防止大家的质疑:)。而M$的程序大可以这么写:
#include <windows.h> //这个和大家用的一样
#include "windows_in.h" //这个是M$自用的,外人别想看到^o^

HSOMETHINGELSE DoSomething(HSOMETHING hSomething) {
struct RealSomething* p = (struct RealSomething*)hSomething; //先强制类
型转换成内部结构指针
……do something……
return (HSOMETHINGELSE)pRealSomethingElse;//强制类型逆转换
}
 
我的理解,HANDLE就是你运行程序时在窗体工具样上的哪个东东,例如,打开记事本后它此
时的句柄就是窗本工具栏上的’无标题-记事本’也就是说程序的句柄就是我要在OPTION里设
置的那个工程名
 
我认为是一个可以掌握的对象!
 
什么是句柄?呵呵,那么老的贴子我都贴出来了,如果还。。。就没办法了。

摘自 济南万千的VB讨论组
panda wrote in message
news:38248fd4.9969239@202.102.152.89...
什么是句柄?


句柄就是用来区分各种内存对象的唯一标识符号,是个32位整数。
有些是整个系统唯一(如窗口句柄),有些是当前进程或线程中唯一
(如线程句柄,全局的有另一个标识符)。

详细的可分为许多种,都是以H开头的。在VB中使用时全部都用Long。
常见的有窗口句柄(HWND),设备描述表句柄(HDC),内存句柄(HMEM),
文件句柄,进程句柄,线程句柄,笔的类型句柄(HPEN),字体句柄(HFONT),
区域句柄(HRGN)等等。

在申请句柄时是要占用资源的,分三类SYSTEM、USER、GDI。
而WINDOWS的资源是固定的,并不随内存的扩大而扩大,所以使用完以后一定要释
放。
>
如果只用VB本身的代码一般是不会用到句柄的,但要是使用API函数的话,
大多数会使用。



(补充)

发件人: 獾猪哥哥
主题: Re: 什么是句柄?
日期: 星期日 1999年11月7日 19:17

补充几点:

再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不过是应用程序自定义的一些索引之类的东东,具体的意义和应用程序相
 
简而言之,句柄就是特务代码,或者为了找到特务所需要的门牌号码!
 
模块的Handle就是它在内存中的地址。
最近研究PE文件结构,偶然发现这个秘密。
handle:=loadlibrary(a.exe);
从handle处开始即是a.exe的内存映像。可以试一试
copymemory(@hhh,Pointer(handle),$100);
 
打个比方,人用身份证来管理社会,程序用handle来管理程序,
 
我一直這樣抽象的認為﹕

在一個數據庫中﹐recno()返回的就是這條記錄的"句柄"﹕
在WINDOWS 中 ﹐handle()返回的就是這個程序﹐或是模塊在WINDOWS中的句柄﹗
 
一个指针
指向一些未知结构的数据 (只有 M$ 知道)
 
后退
顶部