Chinaunix首页 | 论坛 | 博客
  • 博客访问: 85187
  • 博文数量: 18
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-16 09:54
文章分类
文章存档

2008年(18)

我的朋友

分类:

2008-11-10 14:55:39

 
关于hwnd,hmoudle,handle,hinstance

微软整个windows出来是满口的瞎话,到处是胡乱的宏,先转篇文章以后继续。

Belle的那篇文章就是经典的M$瞎话^o^  
   
  下面注意听我的证据:  
  请先到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       //这个和大家用的一样  
  #include   "windows_in.h"     //这个是M$自用的,外人别想看到^o^  
   
  HSOMETHINGELSE   DoSomething(HSOMETHING   hSomething)   {  
          struct   RealSomething*   p   =   (struct   RealSomething*)hSomething;   //先强制类型转换成内部结构指针  
          ……do   something……  
          return   (HSOMETHINGELSE)pRealSomethingElse;//强制类型逆转换  
  }  

阅读(696) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~