Windows數據類型探幽

Windows數據類型(一)

 

  由微軟Windows操作系統所支持的各種數據類型是用來定義函數的返回值、函數和消息的參數以及結構體成員(因爲Win32程序是用C語言來編寫,所以沒有“類”這個概念)的。這些數據類型定義了上述元素的尺碼(在內存中的,也就是佔用內存的字節數)和含義。筆者以前一直不太注意這些東西,結果在程序設計時可謂步履維艱。不同類型的常/變量,在程序用扮演的角色相去甚遠,瞭解這些類型,對剖析程序的工作原理是非常有用的。今天又是週末,我把這些類型列出來,然後把它們的“原形”也找出來——是不是很像“照妖鏡”呀。

       下面這張表裏包括這些類型:字符類型(character),整數類型(integer),邏輯值類型(布爾型,海峽那邊的兄弟們喜歡叫“布林型”,Boolean),指針類型(pointer),句柄型(handle)。其中,字符類型、整數類型和邏輯值(布爾)類型是C語言編譯器通用的,也就是與標準C語言一樣。大多數指針類型都是以PPointer)或者LPLong 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)宏定義…… 實例的句柄

 

續表

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結構體指針  

 

續表

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.

 

最後這張表是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
發佈了5 篇原創文章 · 獲贊 4 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章