Windows Data Types
Windows数据类型
由微软Windows操作系统所支持的各种数据类型是用来定义函数的返回值、函数和消息的参数以及结构体成员(因为Win32程序是用C语言来编写,所以没有“类”这个概念)的。这些数据类型定义了上述元素的尺码(在内存中的,也就是占用内存的字节数)和含义。笔者以前一直不太注意这些东西,结果在程序设计时可谓步履维艰。不同类型的常/变量,在程序用扮演的角色相去甚远,了解这些类型,对剖析程序的工作原理是非常有用的。今天又是周末,我把这些类型列出来,然后把它们的“原形”也找出来——是不是很像“照妖镜”呀。
下面这张表里包括这些类型:字符类型(character),整数类型(integer),逻辑值类型(布尔型,海峡那边的兄弟们喜欢叫“布林型”,Boolean),指针类型(pointer),句柄型(handle)。其中,字符类型、整数类型和逻辑值(布尔)类型是C语言编译器通用的,也就是与标准C语言一样。大多数指针类型都是以P(Pointer)或者LP(Long Pointer)前缀开头。“句柄”是指被装载进内存的一个资源(本质而言就是指一定范围内的唯一编号)。
下面这张表是我结合MSDN里的资料制作的,因为自己也是初学,做的还比较粗糙,请大家多多指正:)
Windows数据类型 |
本质类型 |
字节数 |
定义过程(来历) |
含义 | ||||
ATOM |
unsigned short |
2 |
unsigned short→WORD→ATOM |
在Atom表中,一键(16位整数)一值(一个String)为一个Atom。 | ||||
BOOL |
int |
* |
int→BOOL |
逻辑变量,布尔值 (取值为 TRUE 或 FALSE) | ||||
BOOLEAN |
unsigned char |
1 |
unsigned char→BYTE→BOOLEAN |
逻辑变量,布尔值 (取值为 TRUE 或 FALSE) | ||||
BYTE |
unsigned char |
1 |
unsigned char→BYTE |
字节型,8位。 | ||||
CALLBACK |
__stdcall |
调用 |
__stdcall→CALLBACK |
回调函数的调用约定 | ||||
CHAR |
char |
1 |
char→CHAR |
8位Windows字符(ANSI) | ||||
COLORREF |
unsigned long |
4 |
unsigned long→DWORD→COLORREF |
红,绿,蓝(RGB)值 | ||||
CONST |
const |
关键字 |
const→CONST |
常量 | ||||
CRITICAL_SECTION |
RTL_CRITICAL_SECTION结构体 |
? |
RTL_CRITICAL_SECTION(结构)→CRITICAL_SECTION |
Critical-section对象 | ||||
DWORD |
unsigned long |
4 |
unsigned long→DWORD |
32位无符号整数 | ||||
DWORD_PTR |
unsigned long |
4 |
unsigned long→ULONG_PTR→DWORD_PTR(另有其它路径) |
略……(用处挺大,不过太长了) | ||||
DWORD32 |
unsigned int |
* |
unsigned int→DWORD32 |
32位无符号整数 | ||||
DWORD64 |
unsigned __int64 |
8 |
unsigned __int64→DWORD64 |
64位无符号整数 | ||||
FLOAT |
float |
4 |
float→FLOAT |
浮点数变量 | ||||
HACCEL |
HACCEL__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义的指向HACCEL__结构体的指针 |
快捷键列表的句柄 | ||||
HANDLE |
void *(一个地址) |
|
void *→HANDLE |
对象的句柄 | ||||
HBITMAP |
HBITMAP__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义的指向HBITMAP__结构体的指针 |
位图的句柄 | ||||
HBRUSH |
HBRUSH__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
画刷的句柄 | ||||
HCONV |
HCONV__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
动态数据交换(DDE)会话的句柄 | ||||
HCONVLIST |
HCONVLIST__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
动态数据交换(DDE)会话列表的句柄 | ||||
HCURSOR |
HICON__结构体指针 |
|
HICON__ *→HICON→HCURSOR |
光标的句柄 | ||||
HDC |
HDC__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
设备上下文(DC)的句柄 | ||||
HDDEDATA |
HDDEDATA__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
动态数据交换数据的句柄 | ||||
HDESK |
HDESK__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
桌面(Desktop)的句柄 | ||||
HDROP |
HDROP__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
Handle to an internal drop structure. | ||||
HDWP |
void *(一个地址) |
|
void *→HANDLE→HDWP |
Handle to a deferred window position structure. | ||||
HENHMETAFILE |
HENHMETAFILE__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
增强图元文件的句柄 | ||||
HFILE |
int |
* |
int→HFILE |
由OpenFile(而不是CreateFile)打开的文件的句柄. | ||||
HFONT |
HFONT__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
字体的句柄 | ||||
HGDIOBJ |
void near * |
|
void NEAR *→HGDIOBJ |
GDI对象的句柄 | ||||
HGLOBAL |
void *(一个地址) |
|
void *→HANDLE→HGLOBAL |
全局内存块的句柄 | ||||
HHOOK |
HHOOK__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
句子(hook)的句柄 | ||||
HICON |
HICON__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
图标的句柄 | ||||
HIMAGELIST |
_IMAGELIST结构体指针 |
|
_IMAGELIST *→HIMAGELIST |
图片列表的句柄 | ||||
HIMC |
HIMC__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
输入上下文的句柄 | ||||
HINSTANCE |
HINSTANCE__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
实例的句柄 | ||||
HKEY |
HKEY__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义……(另有一条路径,一样) |
注册表键的句柄 | ||||
HKL |
HKL__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
输入点标识符 | ||||
HLOCAL |
void *(一个地址) |
|
void *→HANDLE→HLOCAL |
本地内存块的句柄 | ||||
HMENU |
HMENU__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
菜单的句柄 | ||||
HMETAFILE |
HMETAFILE__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
图元文件的句柄 | ||||
HMODULE |
HINSTANCE__结构体指针 |
|
HINSTANCE__*→HINSTANCE→HMODULE |
模块的句柄。值由模块的位置来决定。 | ||||
HMONITOR |
HMONITOR__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
显示器的句柄 | ||||
HPALETTE |
HPALETTE__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
调色板的句柄 | ||||
HPEN |
HPEN__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
画(线)笔的句柄 | ||||
HRGN |
HRGN__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
区域的句柄 | ||||
HRSRC |
HRSRC__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
资源的句柄 | ||||
HSZ |
HSZ__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
动态数据交换(DDE)字符串的句柄 | ||||
HWINSTA |
HWINSTA__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
窗口状态的句柄 | ||||
HWND |
HWND__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
窗口的句柄 | ||||
INT |
int |
* |
int→INT |
32位有符号整数 | ||||
INT_PTR |
int(_W64 int即__w64 int) |
* |
_W64 int→INT_PTR,_W64就是__w64,是为了解决32位与64位编译器的兼容性而设置的关键字 |
用于指针运算 | ||||
INT32 |
signed int |
* |
signed int→INT32 |
32位有符号整数 | ||||
INT64 |
signed __int64 |
8 |
signed __int64→INT64 |
64位有符号整数 | ||||
LANGID |
unsigned short |
2 |
unsigned short→WORD→LANGID |
语言标识符 | ||||
LCID |
unsigned long |
4 |
unsigned long→DWORD→LCID |
Locale identifier. | ||||
LCTYPE |
unsigned long |
4 |
unsigned long→DWORD→LCTYPE |
Locale information type. | ||||
LONG |
long |
4 |
long→LONG |
32位有符号整数 | ||||
LONG_PTR |
long |
4 |
_W64 long→LONG_PTR |
用于指针运算 | ||||
LONG32 |
signed int |
* |
signed int→LONG32 |
32位有符号整数 | ||||
LONG64 |
__int64 |
8 |
__int64→LONG64 |
64位有符号整数 | ||||
LONGLONG |
__int64 |
8 |
__int64→LONGLONG |
64位有符号整数 | ||||
LPARAM |
long |
4 |
_W64 long→LONG_PTR→LPARAM |
消息的参数 | ||||
LPBOOL |
int * |
|
int→BOOL, BOOL far *→LPBOOL |
BOOL类型的指针 | ||||
LPBYTE |
unsigned char * |
|
unsigned char→BYTE,BYTE far *→LPBYTE |
BYTE类型的指针 | ||||
LPCOLORREF |
unsigned long * |
|
unsigned long→WORD,DWORD *→LPCOLORREF |
颜色值的指针 | ||||
LPCRITICAL_SECTION |
RTL_CRITICAL_SECTION结构体指针 |
|
RTL_CRITICAL_SECTION *PRTL_CRITICAL_SECTION→,PRTL_CRITICAL_SECTION→LPCRITICAL_SECTION |
CRITICAL_SECTION的指针 | ||||
LPCSTR |
静态char * |
|
char→CHAR,CONST CHAR *→LPCSTR |
静态8位Windows字符(ANSI)无终结字符串指针 | ||||
LPCTSTR |
静态wchar_t * |
|
wchar_t→WCHAR,CONST WCHAR *→LPCWSTR,LPCWSTR→LPCTSTR |
如果UNICODE已定义则为LPCWSTR,否则为LPCTSTR | ||||
LPCVOID |
静态void * |
|
CONST void far *→LPCVOID |
任何类型的静态指针 | ||||
LPCWSTR |
静态wchar_t * |
|
wchar_t→WCHAR,CONST WCHAR *→LPCWSTR |
静态16位Windows字符(Unicode)无终结字符串指针 | ||||
LPDWORD |
unsigned long * |
|
unsigned long→DWORD,DWORD far *→LPDWORD |
DWORD的指针 | ||||
LPHANDLE |
指向句柄的指针 |
|
void *→HANDLE,HANDLE FAR *→LPHANDLE |
HANDLE的指针 | ||||
LPINT |
int * |
|
int far *→LPINT |
INT的指针 | ||||
LPLONG |
long * |
|
long far *→LPLONG |
LONG的指针 | ||||
LPSTR |
char * |
|
char→CHAR,CHAR *→LPSTR |
8位Windows字符(ANSI)无终结字符串指针 | ||||
LPTSTR |
wchar_t * |
|
wchar_t WCHAR,WCHAR *→LPWSTR,LPWSTR→LPTSTR |
An LPWSTR if UNICODE is defined, an LPSTR otherwise. | ||||
LPVOID |
void * |
|
void far *→LPVOID |
任何类型的指针 | ||||
LPWORD |
unsigned short * |
|
unsigned short→WORD,WORD far *→LPWORD |
WORD的指针 | ||||
LPWSTR |
wchar_t * |
|
wchar_t→WCHAR,WCHAR *→LPWSTR |
16位Windows字符(ANSI)无终结字符串指针 | ||||
LRESULT |
long |
4 |
_W64 long→LONG_PTR→LRESULT |
有符号的消息处理结果 | ||||
LUID |
LUID结构 |
|
|
局部唯一标识符 | ||||
PBOOL |
int * |
|
int→BOOL,BOOL near *→PBOOL |
BOOL的指针 | ||||
PBOOLEAN |
unsigned char * |
|
unsigned char→BYTE→BOOLEAN,BOOLEAN *→PBOOLEAN |
BOOL的指针 | ||||
PBYTE |
unsigned char * |
|
unsigned char→BYTE,BYTE near *→PBYTE |
BYTE的指针 | ||||
PCHAR |
char * |
|
char→CHAR,CHAR *→PCHAR |
CHAR的指针 | ||||
PCRITICAL_SECTION |
RTL_CRITICAL_SECTION结构体指针 |
|
RTL_CRITICAL_SECTION *→PRTL_CRITICAL_SECTION,PRTL_CRITICAL_SECTION→PCRITICAL_SECTION |
CRITICAL_SECTION的指针 | ||||
PCSTR |
静态char * |
|
char→CHAR,CONST CHAR *→PCSTR |
静态8位Windows字符(ANSI)无终结字符串指针 | ||||
PCTSTR |
静态wchar_t * |
|
wchar_t→WCHAR,CONST WCHAR *→LPCWSTR,LPCWSTR→PCTSTR |
如果UNICODE已定义则为PCWSTR,否则为PCSTR | ||||
PCWCH |
静态wchar_t * |
|
wchar_t→WCHAR,CONST WCHAR *→PCWCH |
WCHAR的静态指针 | ||||
PCWSTR |
静态wchar_t * |
|
wchar_t→WCHAR,CONST WCHAR *→PCWSTR |
静态16位Windows字符(Unicode)无终结字符串指针 | ||||
PDWORD |
unsigned long * |
|
unsigned long→DWORD,DWORD near *→PDWORD |
DWORD的指针 | ||||
PFLOAT |
float * |
|
float→FLOAT,FLOAT *→PFLOAT |
FLOAT的指针 | ||||
PHANDLE |
指向句柄的指针 |
|
void *→HANDLE,HANDLE *→PHANDLE |
HANDLE的指针 | ||||
PHKEY |
指向HKEY的指针 |
|
HKEY__ *→HKEY *→PHKEY |
HKEY的指针 | ||||
PINT |
int * |
|
int near *→PINT |
INT的指针 | ||||
PLCID |
unsigned long * |
|
unsigned long→DWORD,DWORD near *→PDWORD→PLCID |
LCID的指针 | ||||
PLONG |
long * |
|
long→LONG,LONG *→PLONG |
LONG的指针 | ||||
PLUID |
LUID结构体指针 |
|
LUID *→PLUID |
LUID的指针 | ||||
POINTER_32 |
void * |
|
void *→POINTER_32 |
32位指针(详解略) | ||||
POINTER_64 |
void * |
|
void *→POINTER_64 |
64位指针(详解略) | ||||
PSHORT |
short * |
|
short→SHORT,SHORT *→PSHORT |
SHORT的指针 | ||||
PSTR |
char * |
|
char→CHAR,CHAR *→PSTR |
8位Windows字符(ANSI)无终结字符串指针 | ||||
PTBYTE |
wchar_t * |
|
wchar_t→WCHAR,WCHAR *→PTBYTE |
TBYTE的指针 | ||||
PTCHAR |
wchar_t * |
|
wchar_t→WCHAR,WCHAR *→PTCHAR |
TCHAR的指针 | ||||
PTSTR |
wchar_t * |
|
wchar_t→WCHAR,WCHAR *→LPWSTR→PTSTR |
PWSTR if UNICODE is defined, a PSTR otherwise. | ||||
PTBYTE |
wchar_t * |
|
wchar_t→WCHAR,WCHAR *→PTBYTE |
TBYTE的指针 | ||||
PTCHAR |
wchar_t * |
|
wchar_t→WCHAR,WCHAR *→PTCHAR |
TCHAR的指针 | ||||
PTSTR |
wchar_t * |
|
wchar_t→WCHAR,WCHAR *→LPWSTR→PTSTR |
A PWSTR if UNICODE is defined, a PSTR otherwise. | ||||
PUCHAR |
unsigned char * |
|
unsigned char→UCHAR,UCHAR *→PUCHAR |
UCHAR的指针 | ||||
PUINT |
unsigned int * |
|
unsigned int *→PUINT(呵呵,为什么不用UINT*来定义呢?) |
UINT的指针 | ||||
PULONG |
unsigned long * |
|
unsigned long→ULONG,ULONG *→PULONG |
ULONG的指针 | ||||
PUSHORT |
unsigned short * |
|
unsigned short→USHORT,USHORT *→PUSHORT |
USHORT的指针 | ||||
PVOID |
void * |
|
void *→PVOID |
任何类型的指针 | ||||
PWCHAR |
wchar_t * |
|
wchar_t→WCHAR,WCHAR *→PWCHAR |
WCHAR的指针 | ||||
PWORD |
unsigned short * |
|
unsigned short→WORD,WORD near *→PWORD |
WORD的指针 | ||||
PWSTR |
wchar_t * |
|
wchar_t→WCHAR,WCHAR *→PWSTR |
16位Windows字符(Unicode)无终结字符串指针 | ||||
REGSAM |
unsigned long |
|
unsigned long→DWORD→ACCESS_MASK→REGSAM |
注册表值的安全访问掩码 | ||||
SC_HANDLE |
SC_HANDLE__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
Handle to a service control manager database. | ||||
SC_LOCK |
void * |
|
void far *→LPVOID→SC_LOCK |
Handle to a service control manager database lock. | ||||
SERVICE_STATUS_HANDLE |
SERVICE_STATUS_HANDLE__结构体指针 |
|
由DECLARE_HANDLE(name)宏定义…… |
Handle to a service status value. | ||||
SHORT |
short |
2 |
short→SHORT |
短整数类型(16位) | ||||
SIZE_T |
unsigned long |
4 |
unsigned long→ULONG_PTR→SIZE_T |
指针可指向的最大字节数 | ||||
SSIZE_T |
long |
|
_W64 long→LONG_PTR→SSIZE_T |
有符号SIZE_T. | ||||
TBYTE |
wchar_t |
2 |
wchar_t→WCHAR,WCHAR→TBYTE |
如果UNICODE已定义则为WCHAR,否则为CHAR | ||||
TCHAR |
wchar_t |
2 |
wchar_t→WCHAR,WCHAR→TCHAR |
如果UNICODE已定义则为WCHAR,否则为CHAR | ||||
UCHAR |
unsigned char |
1 |
unsigned char→UCHAR |
无符号CHAR | ||||
UINT |
unsigned int |
* |
unsigned int→UINT |
无符号INT | ||||
UINT_PTR |
unsigned int |
* |
unsigned int→UINT_PTR |
无符号INT_PTR. | ||||
UINT32 |
unsigned int |
2 |
unsigned int→UINT32 |
无符号INT32. | ||||
UINT64 |
unsigned __int64 |
4 |
unsigned __int64→UINT64 |
无符号INT64. | ||||
ULONG |
unsigned long |
4 |
unsigned long→ULONG |
无符号LONG. | ||||
ULONG_PTR |
unsigned long |
4 |
unsigned long→ULONG_PTR |
无符号LONG_PTR. | ||||
ULONG32 |
unsigned int |
2 |
unsigned int→ULONG32 |
无符号LONG32 | ||||
ULONG64 |
unsigned __int64 |
4 |
unsigned __int64→ULONG64 |
无符号LONG64 | ||||
ULONGLONG |
unsigned __int64 |
4 |
unsigned __int64→ULONGLONG |
64位无符号整数 | ||||
UNSIGNED |
没查到,大家帮忙吧 |
|
|
无符号属性 | ||||
USHORT |
unsigned short |
|
unsigned short→USHORT |
无符号SHORT类型 | ||||
VOID |
void |
|
void→VOID |
任何类型 | ||||
WCHAR |
wchar_t |
2 |
wchar_t→WCHAR |
16位Unicode字符 | ||||
WINAPI |
__stdcall |
调用 |
__stdcall→WINAPI |
系统函数(API函数)调用约定 | ||||
WORD |
unsigned short |
2 |
unsigned short→WORD |
16位无符号整数 | ||||
WPARAM |
unsigned int |
* |
unsigned int→UINT_PTR→WPARAM |
消息的参数 | ||||
注:DECLARE_HANDLE宏的定义如下。
#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
在列表中,是按前半部分的宏定义而写的,请大家注意。
最后这张表是Visual C++ 7.1编译器支持的数据类型,也就是Windows各种数据类型的“根源”了。
数据类型名称 |
字节数 |
别名 |
取值范围 |
int |
* |
signed,signed int |
由操作系统决定,即与操作系统的"字长"有关 |
unsigned int |
* |
unsigned |
由操作系统决定,即与操作系统的"字长"有关 |
__int8 |
1 |
char,signed char |
–128 到 127 |
__int16 |
2 |
short,short int,signed short int |
–32,768 到 32,767 |
__int32 |
4 |
signed,signed int |
–2,147,483,648 到 2,147,483,647 |
__int64 |
8 |
无 |
–9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
bool |
1 |
无 |
false 或 true |
char |
1 |
signed char |
–128 到 127 |
unsigned char |
1 |
无 |
0 到 255 |
short |
2 |
short int,signed short int |
–32,768 到 32,767 |
unsigned short |
2 |
unsigned short int |
0 到 65,535 |
long |
4 |
long int,signed long int |
–2,147,483,648 到 2,147,483,647 |
long long |
8 |
none (but equivalent to __int64) |
–9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
unsigned long |
4 |
unsigned long int |
0 到 4,294,967,295 |
enum |
* |
无 |
由操作系统决定,即与操作系统的"字长"有关 |
float |
4 |
无 |
3.4E +/- 38 (7 digits) |
double |
8 |
无 |
1.7E +/- 308 (15 digits) |
long double |
8 |
无 |
1.7E +/- 308 (15 digits) |
wchar_t |
2 |
__wchar_t |
0 到 65,535 |
经过十多个小时的“奋战”,终于完成了:)
很开心。不过我知道,其中肯定有不完善甚至是错误的地方,请大家多多批评指正,在此先谢过大家。