Skip to content

常见数据类型

WindowsAPI使用了很多Windows自定义的数据类型(如前面课程的HINSTANCE、HWND、WPARAM等)。要熟练使用WindowsAPI必须要熟悉Windows数据类型,有些类型都是从标准C的数据类型经过类型重定义而来,有些类型是Windows特有的,自定义类型一般遵循以下规则:

  • 基本数据类型大写:比如charCHARshortSHORTintINT等。

  • 指针类型的命令方式一般是在其指向的数据类型前加"LP"或“P”,比如指向DWORD的指针类型为"LPDWORD"和“PDWORD"

  • 各种句柄类型的命名方式一般都是在对象名前加“H”,比如位图(BITMAP)对应的句柄类型为"HBITMAP"

  • 无符号类型一般是以“U”开头,比如“INT”是符号类型,"UINT”是无符号类型

1.基本类型

minwindef.h

类型等同于类型定义
BYTEunsigned chartypedef unsigned char BYTE;
WORDunsigned shorttypedef unsigned short WORD;
BOOLinttypedef int BOOL;
DWORDunsigned longtypedef unsigned long DWORD;
FLOATfloattypedef float FLOAT;
INTinttypedef int INT;
UINTunsigned inttypedef unsigned int UINT;
ULONGunsigned longtypedef unsigned long ULONG;
ATOMWORDtypedef WORD ATOM;

2.基本类型指针

minwindef.h、basetsd.h

类型定义
LPFLOATtypedef FLOAT far* LPFLOAT;
LPBOOLtypedef BOOL far* LPBOOL;
LPVOIDtypedef void far* LPVOID;
PUINTtypedef unsigned int* PUINT;
INT_PTRtypedef int INT_PTR, *PINT_ PTR;
UINT_PTRtypedef unsigned int UINT_PTR, *PUINT_PTR;
LONG_PTRtypedef long LONG_PTR,*PLONG_PTR;
ULONG_PTRtypedef unsigned long ULONG_PTR,*PULONG_PTR;
SIZE_Ttypedef ULONG_PTR SIZE_T, *PSIZE_T;
WPARAMtypedef UINT_PTR WPARAM;
LPARAMtypedef LONG PTR LPARAM;
LRESULTtypedef LONG_PTR LRESULT;

3.限制空间整形

basetsd.h

类型定义
INT8typedef signed char INT8, *PINT8;
INT16typedef signed short INT16, *PINT16;
INT32typedef signed int INT32,*PINT32;
INT64typedef signed __int64 INT64, *PINT64;
UINT8typedef unsigned char UINT8, *PUINT8;
UINT16typedef unsigned short UINT16, *PUINT16;
UINT32typedef unsigned int UINT32, *PUINT32
UINT64typedef unsigned __int64 UINT64, *PUINT64;
LONG32typedef signed int LONG32, *PLONG32;
ULONG32typedef unsigned int ULONG32,*PULONG32;

4.浮点、字符、布尔型

WTypesbase.h、Winnt.h

类型定义
DOUBLEtypedef double DOUBLE;
USHORTtypedef unsigned short USHORT;
SHORTtypedef short SHORT;
UCHARtypedef unsigned char UCHAR;
CHARtypedef char CHAR;
WCHARtypedef wchar_t WCHAR;
LONGtypedef long LONG;
LPSTR、PSTRtypedef CHARR *NPSTR, *LPSTR, *PSTR;
LPCSTR、PCSTRtypedef CONST CHAR *LPCSTR, *PCSTR;
BOOLEANtypedef BYTE BOOLEAN;

5.句柄

在Windows中,句柄是用来标志应用程序中建立的或是使用的唯一整数值(4字节(64位程序中为8字节)),句一个系统内部数据结构的引l用。

Windows大量使用了句柄来标识对象,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,例如当你创建一个窗口,系统会给你一个窗口句柄,不仅仅局限于窗口、位图、图标、内存块、光标、字体、菜单等。应用程序能够通过句柄访问相应的对象的信息,许多WindowsAPI函数把句柄作为它的第一个参数,但是程序不能利用句柄来直接阅读文件中的信息。如果句柄不在I/O文件中,它是毫无用处的。

在Windows编程中会用到大量的句柄,比如:

  • HINSTANCE(实例句柄)
  • HBITMAP(位图句柄)
  • HDC(设描述表句柄)
  • HICON(图标句柄)

这当中还有一个通用的句柄,就是HANDLE。

类型句柄定义
HANDLE通用句柄typedef void *HANDLE;
HWND窗口句柄DECLARE_HANDLE(HWND);
HINSTANCE实例句柄DECLARE_HANDLE(HINSTANCE);
HMODULEDLL模块句柄typedef HINSTANCE HMODULE;

DECLARE_HANDLE宏定义

c++
#define DECLARE_HANDLE(name) struct name##_{int unused;}; typedef struct name##_*name

在这种情况下相当于先定义了一个结构体,

c++
struct name##__
{
	int unused;
}

typedef struct name##__ *name

其实就相当于定义了一个指针类型name

c++
struct name##__
{
	int unused;
}*name;

5.1 常用句柄

类型句柄定义
HDC设备上下文句柄DECLARE_HANDLE(HDC);
HICON图标句柄DECLARE_HANDLE(HICON);
HFONT字体句柄DECLARE_HANDLE(HFONT);
HMENU菜单句柄DECLARE_HANDLE(HMENU);
HBRUSH画刷句柄DECLARE_HANDLE(HBRUSH);
HPEN笔句柄DECLARE_HANDLE(HPEN);
HKEY注册表句柄DECLARE_HANDLE(HKEY);
HBITMAP位图句柄DECLARE_HANDLE(HBITMAP);

6.符号定义

类型定义
CONST#define CONST const
CALLBACK#define CALLBACK __stdcall
WINAPI#define WINAPI __stdcall
VOID#define VOID void

7.通用符号定义

不同字符集下符号定义不同

7.1 UNICODE字符

类型定义
TCHARtypedef WCHAR TCHAR, *PTCHAR;
TEXT#define TEXT(quote) L##quote
API函数名#define CreateWindow CreateWindowW

7.2 多字节字符MBCS

类型定义
TCHARtypedef char TCHAR, *PTCHAR;
TEXT#define TEXT(quote) quote
API函数名#define CreateWindow CreateWindowA

MIT Licensed