Windows数据类型(FantasiaX原创)
由微软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结构体指针 | 由DECLAREHANDLE(name)宏定义…… | 动态数据交换(DDE)会话的句柄 | |
HCONVLIST | HCONVLIST结构体指针 | 由DECLARE_HANDLE(name)宏定义…… | 动态数据交换(DDE)会话列表的句柄 | |
HCURSOR | HICON结构体指针 | HICON *→HICON→HCURSOR | 光标的句柄 | |
HDC | HDC结构体指针 | 由DECLAREHANDLE(name)宏定义…… | 设备上下文(DC)的句柄 | |
HDDEDATA | HDDEDATA结构体指针 | 由DECLARE_HANDLE(name)宏定义…… | 动态数据交换数据的句柄 | |
HDESK | HDESK结构体指针 | 由DECLAREHANDLE(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结构体指针 | 由DECLAREHANDLE(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结构体指针 | 由DECLAREHANDLE(name)宏定义…… | 实例的句柄 | |
HKEY | HKEY结构体指针 | 由DECLARE_HANDLE(name)宏定义……(另有一条路径,一样) | 注册表键的句柄 | |
HKL | HKL结构体指针 | 由DECLAREHANDLE(name)宏定义…… | 输入点标识符 | |
HLOCAL | void (一个地址) | void →HANDLE→HLOCAL | 本地内存块的句柄 | |
HMENU | HMENU结构体指针 | 由DECLARE_HANDLE(name)宏定义…… | 菜单的句柄 | |
HMETAFILE | HMETAFILE结构体指针 | 由DECLAREHANDLE(name)宏定义…… | 图元文件的句柄 | |
HMODULE | HINSTANCE结构体指针 | HINSTANCE*→HINSTANCE→HMODULE | 模块的句柄。值由模块的位置来决定。 | |
HMONITOR | HMONITOR结构体指针 | 由DECLARE_HANDLE(name)宏定义…… | 显示器的句柄 | |
HPALETTE | HPALETTE结构体指针 | 由DECLAREHANDLE(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→INTPTR,_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的指针 |
POINTER32 | void | void →POINTER32 | 32位指针(详解略) | |
POINTER64 | void | void →POINTER64 | 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 |
还没有评论,来说两句吧...