我的理解:
windows系统有一个名词叫"资源",比如窗口、菜单等都构成资源,确切地说它们是消耗资源(这个资源是指硬件)的东西,以菜单为例,系统为了显示一个菜单,它得在内存中开辟一定的空间,其中是对菜单的描述,包括每个子项的文本、ID、状态等内容。Windows系统一旦启动,内存中就有好多这样的东西在占用系统资源,Windows要对它们进行管理,比如内存不够的时候,它得决定把那些东西暂时先从内存搬出去。系统要访问这些东西,怎么找到它们呢?系统为它们每人分配一个号(保证唯一),这就是句柄了。刚开始的时候搞不清句柄和指针的关系:比如对于一个窗口,有一个句柄和一个指针(当然是CWin类的指针)与之相对应,它们有什么区别呢?句柄和指针是两个不同世界的概念。句柄是系统级的,与编程无关,它只管访问到必要的信息;指针是编程领域内的事(我是特指上面提到的CWin类指针),通过该指针,可以对窗口或其它什么东西进行必要的操作,比如 ->MoveWindows(…);    其实如果你能搞清楚Windows对象和C++对象之间的联系和区别就很好理解这一点了。前面所说的在内存中存放的对菜单的描述就是所谓Windows对象了;为了操作它,VC程序会先构筑一个相应的C++对象,如CMenu对象。

解决方案 »

  1.   

    句柄是WINDOWS程序标识每个资源的32位数据值,每一个句柄同一个指针对应。但句柄由WINDOWS统一管理,就是说你可以在某软件运行时通过WINDOWS API函数捕获其它程序的名柄.
      

  2.   

    happylaodu(青菜豆腐)说的有道理。
    你可以在VC6里查一查handle的定义,是unsigned long,说白了就是相当于学号的东东。系统规定你的资源是第几号就分给你一个相应的资源ID(学号),这就是handle了。
    窗体?记不清了,是不是指的Frame?如果是那就是指你的应用程序的编框了,呵呵:)。
      

  3.   

    搜索一下过去的帖子,有很多解答的。我给你找了一些,如下:回复贴子: 
     回复人:kxy(小康) (2000-3-11 20:58:00)  得0分 
    已答问题中有  
     回复人:lu0() (2000-3-12 17:54:00)  得0分 
    一个OS才理解的值.可能为指针,或数值或其他.
    是作为便于OS自身运作而存在的一个东东.  
     回复人:Shania() (2000-3-16 11:13:00)  得30分 
    句柄是windows为了充分利用内存而引入的一个机制,在32位系统中,它是一个32位的unsigned int;其中保存了一些有关内存地址的信息;它类似于指针但又和指针不同,
    大家都知道指针代表了一个内存地址,用于标始一块内存。在windows中,内存块是可移动的(优化内存的使用),所以我们在使用内存时,当内存发生移动时,原来的指针值代表的内存已经发生了变化。所以windows引入了句柄的概念。句柄值不会变,指针值会变(内存块移动)。
    看了下面的例子你就会明白一点://申请内存,得到唯一句柄值。
    HGLOBAL handle = GlobalAlloc(..,..);//锁定内存块,不让它移动,这样用户就
    //可以通过指针来使用内存块,而不致于由于内存块的移动,而导致指针无效。
    char* ptr = (char*)GlobalLock(handle);
    //use the memory you alloced;such as;
    *ptr='h';GlobalUnlock(handle);//用好后,内存块解锁,允许移动。
    GlobalFree(handle);//如果不再需要内存,释放它。其实象HWND,HBRUSH,HDC,....等等句柄,它们代表的都是一块有特定内容的内存块!  
     回复人:gaoxiaofeng() (2000-3-16 12:53:00)  得0分 
    我也是初学者,我这样体会:句柄类似于指针,不过指针读的是某些变量,而句柄是读取某些object所用。需要用它来获得对应于各类的变量(如窗口、滚动条、对话框等)。我的一点个人感受。  
     回复人:ZPoint() (2000-3-16 20:46:00)  得0分 
    简单地说,句柄就是你定义的对象的指针,你可以在它销毁之前任意地使用它。  
     回复人:jinnie() (2000-3-23 14:20:00)  得0分 
    我感觉句柄比较稳定、安全,存在的时期较长。就象字符指针对于字符数组一样。字符指针得分配内存,字符数组是系统分配的临时变量。不过,句柄得删除,不然,会造成内存泄漏。  
     回复人:sunsetyang() (2000-3-23 15:02:00)  得0分 
    比较通俗一点的说:句柄就是一种利于系统作封装处理的数据结构。它的封装有利于向用户隐藏实现上的细节。它的维护由系统统一维护,有利于维护程序的健壮性。  
     回复人:laole() (2000-3-23 17:06:00)  得0分 
    呵呵,如果把对象和人相比,你可以把句柄理解为身份证。
    它是随对象的生成而产生,随对象的销毁而消灭。任何时
    候只有知道了对象的句柄,就可以找到对象。  
     回复人:Hongshu(鸿哥) (2000-3-24 11:00:00)  得0分 
    句柄就是指向内存块的地址  
     回复人:tianshu() (2000-3-27 19:34:00)  得0分 
    不同的句柄有不同的含义
    比如HMODULE是IMAGE的基地址  回复贴子: 
     回复人:breath(跨马倚斜桥,满楼红袖招) (2000-11-14 12:12:00)  得0分 
    就是一个指针
    在32位windows中占用4个字节
    它指向内存的尺寸由它的类型决定函数用句柄来传递数据  
     回复人:andygood() (2000-11-14 12:22:00)  得20分     句柄在winnt.h中是这么定义的:#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    STRICT修饰符的意思是变量类型是否要求严格定义。在这里,我们可以看到HANDLE其实就是一个void类型的指针。这样有什么用呢?学过c/c++语言的人都知道,void类型的指针可以通过强制类型转换变为任何类型的指针,使用最灵活。    在很多情况下,句柄是一个对象的指针,或者说是地址,一个对象的地址。比如对于分配的一个内存块(对象),它的句柄就是它的首地址,这没什么问题。    但是这并不总是成立的,对于没有对象意义的句柄尤其如此。这就取决与系统的定义了。比如系统钩子的类型HHOOK,说它是地址就没有任何意义。对于窗口句柄也是如此。在这些情况下,我们可以把句柄理解为某事物在系统该类事物列表中的ID。    是不是加点分呀?我从来没回答过50分以下的题目。:) 
     回复人:jiujiejushi(九戒居士) (2000-11-14 14:36:00)  得0分 
    句柄是对象的索引,这样隐藏了危险的地址信息,同时也使系统对象和应用程序隔离。  
     回复人:ddddh(叶君临) (2000-11-14 15:00:00)  得0分 
    句柄,你可以把他想象成一个把子,让别人来拎的把子.至于怎么来拎,是操作系统的事情句柄不是指针,作为内核对象他是系统一个内核对象指针的索引.可以间接的认为他是指针的指针.呵呵,说不清楚,关键是不同的句柄,有不同的处理方法
    你需要知道的是如何得到一个句柄,然后保存他,在需要的地方把他作为参数传给函数就可以了,具体是什么其实不需要知道:)  
     回复人:ddddh(叶君临) (2000-11-14 15:18:00)  得0分 
    倒,发了这么多遍,非我本意!
    nnd csdn...............  
     回复人:andygood() (2000-11-14 17:23:00)  得0分     在32位Windows中,“句柄不是指针”这句话已经不再成立了,比如GlobalAlloc()等内存分配函数返回的句柄实际就是该内存的地址。因此才不需要使用GlobalLock()来锁定句柄以得到地址。这些东西n年以前在MSDN中就说明了。    事实上,有实际对象意义的东西(占用一段存储器),比如上面说的内存的句柄基本就是地址。其它没有对象意义的东西是系统索引。这些你只要看看Windows的那几个头文件就能理解了。    说句题外话,如果没有看过Windows标准头文件和MFC源程序就不能算是真正的Windows程序员。撑死是一个合格的c/c++程序员。 
      

  4.   

       首先s声明我也是个菜鸟,这个大家看看Sunraywang的帖子就知道了
      我觉得作为初学者,对于句柄不需要了解太深 。许多人把句柄说成“似于指针又非指针”,我看的一本国外人编的书,说句柄是“指向指针的指针”,因为WINDOWS竟长作一些内存操作而不通知应用程序,使用指针的话,会产生许多悬挂的指针,理解到这一步就可以了。
       至于AOI嘛,我也是从API 学起的,你可以看看我们老师编的书,清华大学出版社,该书大半部分讲API,小部分讲MFC,我觉得还行
      

  5.   

    那我请诸位向我推荐几本,api 的书。谢谢