请问句柄是什么

楼主xiaoheichm(小黑)2001-05-06 17:51:00 在 VC/MFC / 基础类 提问

我刚学了一段时间的vc看到例程中的句柄还有其他一些我所不知道的非标准结构我感到非常迷惑,请各位年兄给我解释一下,还有请介绍几本比较好的api   方面的书 问题点数:20、回复次数:11Top

1 楼happylaodu(青菜豆腐)回复于 2001-05-06 18:23:00 得分 10

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

2 楼leng(沙漠之舟)回复于 2001-05-06 18:25:00 得分 0

有道理!Top

3 楼yoci(阿呸)回复于 2001-05-06 18:33:00 得分 0

句柄   ==   勺柄Top

4 楼fulaoxiao(米米)回复于 2001-05-06 18:35:00 得分 0

请问什么是窗体?:)Top

5 楼iZap()回复于 2001-05-06 18:42:00 得分 0

搜索一下前面的帖子"句柄"...Top

6 楼wkp(计算机)回复于 2001-05-06 18:45:00 得分 0

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

7 楼pikaqiu(皮卡丘-事实上不大会编程)回复于 2001-05-06 18:47:00 得分 0

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

8 楼pianopan(.)(.)回复于 2001-05-06 18:56:00 得分 0

就像你的身份证号码一样,是一个唯一的数字  
  用来和人一一对应的Top

9 楼jeffreyren(我的心已经乱了感觉)回复于 2001-05-06 19:00:00 得分 10

搜索一下过去的帖子,有很多解答的。  
   
  我给你找了一些,如下:  
   
  回复贴子:    
   回复人: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++程序员。  
   
     
  Top

10 楼sunraywang(missu)回复于 2001-05-06 19:27:00 得分 0

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

11 楼xiaoheichm(小黑)回复于 2001-05-08 17:17:00 得分 0

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

你可能对以下的问题也比较感兴趣....