分享

句柄到底是什么意思?!

 chuanshaoke 2010-04-21
  • 就是一个指针   
    在32位windows中占用4个字节   
    它指向内存的尺寸由它的类型决定   
    函数用句柄来传递数据
 
  • 句柄在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分以下的题目。:)

 

  • 句柄是对象的索引,这样隐藏了危险的地址信息,同时也使系统对象和应用程序隔离。

 

  • 句柄,你可以把他想象成一个把子,让别人来拎的把子.至于怎么来拎,是操作系统的事情   
        
    句柄不是指针,作为内核对象他是系统一个内核对象指针的索引.可以间接的认为他是指针的指针.   
        
     呵呵,说不清楚,关键是不同的句柄,有不同的处理方法   
        
    你需要知道的是如何得到一个句柄,然后保存他,在需要的地方把他作为参数传给函数就可以了,具体是什么其实不需要知道:)

 

  • 在32位Windows中,“句柄不是指针”这句话已经不再成立了,比如GlobalAlloc()等内存分配函数返回的句柄实际就是该内存的地址。因此才不需要使用GlobalLock()来锁定句柄以得到地址。这些东西n年以前在MSDN中就说明了。   
        
        事实上,有实际对象意义的东西(占用一段存储器),比如上面说的内存的句柄基本就是地址。其它没有对象意义的东西是系统索引。这些你只要看看Windows的那几个头文件就能理解了。   
        
        说句题外话,如果没有看过Windows标准头文件和MFC源程序就不能算是真正的Windows程序员。撑死是一个合格的c/c++程序员。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多