常见数据类型
WindowsAPI使用了很多Windows自定义的数据类型(如前面课程的HINSTANCE、HWND、WPARAM等)。要熟练使用WindowsAPI必须要熟悉Windows数据类型,有些类型都是从标准C的数据类型经过类型重定义而来,有些类型是Windows特有的,自定义类型一般遵循以下规则:
基本数据类型大写:比如
char为CHAR、short为SHORT、int为INT等。指针类型的命令方式一般是在其指向的数据类型前加"LP"或“P”,比如指向
DWORD的指针类型为"LPDWORD"和“PDWORD"各种句柄类型的命名方式一般都是在对象名前加“H”,比如位图(BITMAP)对应的句柄类型为"HBITMAP"
无符号类型一般是以“U”开头,比如“INT”是符号类型,"UINT”是无符号类型
1.基本类型
minwindef.h
| 类型 | 等同于 | 类型定义 |
|---|---|---|
| BYTE | unsigned char | typedef unsigned char BYTE; |
| WORD | unsigned short | typedef unsigned short WORD; |
| BOOL | int | typedef int BOOL; |
| DWORD | unsigned long | typedef unsigned long DWORD; |
| FLOAT | float | typedef float FLOAT; |
| INT | int | typedef int INT; |
| UINT | unsigned int | typedef unsigned int UINT; |
| ULONG | unsigned long | typedef unsigned long ULONG; |
| ATOM | WORD | typedef WORD ATOM; |
2.基本类型指针
minwindef.h、basetsd.h
| 类型 | 定义 |
|---|---|
| LPFLOAT | typedef FLOAT far* LPFLOAT; |
| LPBOOL | typedef BOOL far* LPBOOL; |
| LPVOID | typedef void far* LPVOID; |
| PUINT | typedef unsigned int* PUINT; |
| INT_PTR | typedef int INT_PTR, *PINT_ PTR; |
| UINT_PTR | typedef unsigned int UINT_PTR, *PUINT_PTR; |
| LONG_PTR | typedef long LONG_PTR,*PLONG_PTR; |
| ULONG_PTR | typedef unsigned long ULONG_PTR,*PULONG_PTR; |
| SIZE_T | typedef ULONG_PTR SIZE_T, *PSIZE_T; |
| WPARAM | typedef UINT_PTR WPARAM; |
| LPARAM | typedef LONG PTR LPARAM; |
| LRESULT | typedef LONG_PTR LRESULT; |
3.限制空间整形
basetsd.h
| 类型 | 定义 |
|---|---|
| INT8 | typedef signed char INT8, *PINT8; |
| INT16 | typedef signed short INT16, *PINT16; |
| INT32 | typedef signed int INT32,*PINT32; |
| INT64 | typedef signed __int64 INT64, *PINT64; |
| UINT8 | typedef unsigned char UINT8, *PUINT8; |
| UINT16 | typedef unsigned short UINT16, *PUINT16; |
| UINT32 | typedef unsigned int UINT32, *PUINT32 |
| UINT64 | typedef unsigned __int64 UINT64, *PUINT64; |
| LONG32 | typedef signed int LONG32, *PLONG32; |
| ULONG32 | typedef unsigned int ULONG32,*PULONG32; |
4.浮点、字符、布尔型
WTypesbase.h、Winnt.h
| 类型 | 定义 |
|---|---|
| DOUBLE | typedef double DOUBLE; |
| USHORT | typedef unsigned short USHORT; |
| SHORT | typedef short SHORT; |
| UCHAR | typedef unsigned char UCHAR; |
| CHAR | typedef char CHAR; |
| WCHAR | typedef wchar_t WCHAR; |
| LONG | typedef long LONG; |
| LPSTR、PSTR | typedef CHARR *NPSTR, *LPSTR, *PSTR; |
| LPCSTR、PCSTR | typedef CONST CHAR *LPCSTR, *PCSTR; |
| BOOLEAN | typedef 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); |
| HMODULE | DLL模块句柄 | typedef HINSTANCE HMODULE; |
DECLARE_HANDLE宏定义
#define DECLARE_HANDLE(name) struct name##_{int unused;}; typedef struct name##_*name在这种情况下相当于先定义了一个结构体,
struct name##__
{
int unused;
}再typedef struct name##__ *name
其实就相当于定义了一个指针类型name
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字符
| 类型 | 定义 |
|---|---|
| TCHAR | typedef WCHAR TCHAR, *PTCHAR; |
| TEXT | #define TEXT(quote) L##quote |
| API函数名 | #define CreateWindow CreateWindowW |
7.2 多字节字符MBCS
| 类型 | 定义 |
|---|---|
| TCHAR | typedef char TCHAR, *PTCHAR; |
| TEXT | #define TEXT(quote) quote |
| API函数名 | #define CreateWindow CreateWindowA |
