句柄从来就不是只有Windows SDK才有的,也不是$MS发明的专利,在其他的Doors SDK,Chairs SDK,Beds SDK中都大量存在。但是,只有我们可爱的国内的windows和$MS崇拜者们给它起了一个可爱的名字“句柄”。一个令无数初学者魂牵梦绕,欲仙欲死的名字。我敢保证,一个用MFC编程了N久的人也不一定能说出句柄到底是个啥东东。
    好吧,现在大家都学软件工程,设计模式风靡一时,可惜所有的模式都是基于C#的,或是基于java的,要么最多装高深来个C++的。如果后退十年,大家学个基于C的设计模式,“句柄”这么个翻译估计就要笑死人了。
    ok,我们可爱的微软在他的sdk中布满了各种各样的宏,还有那些动辄就是十几个参数的函数,其中得还包括好几个有十几个成员的结构体。算一下,用他一个函数得给他准备快三位数的变量。OMG!最后为了忽悠大家,再来个句柄的概念。
    我们来看看到底什么“句柄”。“句柄”就是个指向伪结构体的指针!什么叫伪结构体?就是一个完全没有实际用处,专门用来忽悠你的结构体。微软的“句柄”通通是这样定义的:
struct
{
int unused;
}
所有的“句柄”都是指向这么个伪结构的指针(这句话应该有误,并非所有,比如msg结构。应该是结构体,有的是结构体指针)。不管是handle,moudle,hinstance,Hbitmap.HFile,HFont啥啥的。
都是指向这么个伪结构体的。目的么?就是把自己真实的数据结构给隐藏起来。举例如下:
    ok,现在我就变身为万恶的微软,让我们来定义个自己的“句柄”,以揭示这万恶的欺骗过程。
/*某头文件*/
#ifndef _MYHAEDER_H
#define _MYHAEDER_H
typedef struct
{
   //int unused;注意,此句被注释掉了。
}*HPerson;
#endif
为了更过瘾的说明问题,这里我干脆定义了一个空结构体。不过,微软比我强,人家干脆定义了一个int unused.直接告诉你,没用。
好,同时再来一个头文件,一个给用户引用的头文件,把上面这个结构体的定义放在里面。
现在再来一个cpp文件,这里面放我们自己内部真正的东西,比如一个有名字的person结构体
/*某cpp文件*/
typedef struct
{
char * name;
}Person;
恩,我们模仿微软的风格,再来2个函数
HPerson CreatePerson()
{
  return (HPerson)new Person;
}
char* GetPersonName(HPerson handle)
{
    return ((Person*)handle)->name;
}
ok,现在明白了吧,这两个函数和这个内部的Person结构体被编译到dll中,我们永远也看不到,我们看到的是那个HPerson句柄,一个空结构体,我们只能用CreatePerson()函数来创建,也只能用GetPersonName()函数来得到它的属性,而我们如果想绕开微软,自己创建,对不起,你创建的只是一个什么都没有的空结构体。
所以 这个句柄就是一个 伪装,一个进进出出的伪装,让你不知道里面到底是什么,你想创建,好,只能用createPerson,想得到属性,只能GetPersonXXX;那个cpp是不公开的,你不知道真实的结构体到底是什么
而你的头文件里 只有那个伪结构体和两个函数的声明。
    那么,到现在,句柄是什么呢?句柄就是隐藏私有数据的一种手段。你不能通过Handler->XXX得到什么。这新鲜么?不新鲜,class里面的private就是这样的。换句话说,面向对象真的是一种思想,用C照样private。可惜,这么一个经常使用的隐藏和保护内部数据的手段,就被翻译成了“句柄”,而且从来不说它是为了隐藏内部机制,只说大家要理解句柄的概念....
    恩,各种成熟的C库都大量使用了这种方式。
posted on 2009-10-27 10:03  maxweii  阅读(205)  评论(0编辑  收藏  举报