転載: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
);
|
次のように、それがマクロ定義であるべきだと思って、引き続きWINDEF.H内のDECLARE_HANDLE()の定義を見てください。
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()は事前定義された条件で定義されているため、条件が真であるかどうかにかかわらず、WINDEF.Hの先頭にあるSTRICTの定義の検索を続けます。
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構造体を指すポインター変数であり、構造体には1つのint変数しかありません。WINDOWSでは、ハンドルはほとんどこのように定義されています。
投稿者:HINSTANCEデータ型 - Windowsプログラミング - メープル竹の夢
在看《 WINDOWS程序设计 》过程中,对于HINSTANCE的理解很重要,网上多数说其是一个整型变量,其实是不对的。http://furzoom.com/
HINSTANCE定义
通过查找HINSTANCE的定义有WINDEF.H中为:
001
|
DECLARE_HANDLE(
HINSTANCE
);
|
次のように、それがマクロ定義であるべきだと思って、引き続きWINDEF.H内のDECLARE_HANDLE()の定義を見てください。
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()は事前定義された条件で定義されているため、条件が真であるかどうかにかかわらず、WINDEF.Hの先頭にあるSTRICTの定義の検索を続けます。
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構造体を指すポインター変数であり、構造体には1つのint変数しかありません。WINDOWSでは、ハンドルはほとんどこのように定義されています。
投稿者:HINSTANCEデータ型 - Windowsプログラミング - メープル竹の夢