天天看點

Windows資料類型探幽—千回百轉你是誰?

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

  經過十多個小時的“奮戰”,終于完成了:)

  很開心。不過我知道,其中肯定有不完善甚至是錯誤的地方,請大家多多批評指正,在此先謝過大家。