作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)
版权声明:本文的版权归作者与博客园共同所有。转载时请在明显地方注明本文的详细链接,未经作者同意请不要删除此段声明,感谢您为保护知识产权做出的贡献。
在看《 WINDOWS程序设计 》过程中,对于HINSTANCE的理解很重要,网上多数说其是一个整型变量,其实是不对的。http://furzoom.com/
HINSTANCE定义
通过查找HINSTANCE的定义有WINDEF.H中为:
001
|
DECLARE_HANDLE(
HINSTANCE
);
|
猜测应该是一条宏定义,继续查看DECLARE_HANDLE()的定义,也在WINDEF.H中,如下:
001
002
003
004
005
006
007
008
|
#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
;
|
可以看出DECLARE_HANDLE()被定义在一个条件预定义中,那么条件是否成立呢,继续查找STRICT的定义,在WINDEF.H的开头下有如下:
001
002
003
004
005
006
007
008
|
#ifndef _WINDEF_
#define _WINDEF_
#ifndef NO_STRICT
#ifndef STRICT
#define STRICT 1
#endif
#endif /* NO_STRICT */
|
这样就知道STRICT是默认被定义的。
接着看DECLARE_HANDLE()宏的定义,
001
|
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
|
##为字符连接,那么
001
|
DECLARE_HANDLE(
HINSTANCE
)
|
等同于
001
|
struct
HINSTANCE__ {
int
unused; };
typedef
struct
HINSTANCE__ *
HINSTANCE
;
|
HINSTANCE是一个指针变量,指向HINSTANCE结构体,而结构体的中只一个int变量。在WINDOWS中句柄多被这种方式进行定义。