转载: https://www.cnblogs.com/furzoom/p/hinstance.html
作者:马 岩(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中句柄多被这种方式进行定义。