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 |
經過十多個小時的“奮戰”,終于完成了:)
很開心。不過我知道,其中肯定有不完善甚至是錯誤的地方,請大家多多批評指正,在此先謝過大家。