---
title : 03_Windows Data Type
---
# Windows Data Type
By Cheng-Yen, Tsai
Date : 2021-05-29
---
## 簡介
針對Windows 32bit api,microsoft有定義很多自己的資料型態,而這些資料型態與早期32位元程式有很大的關係,例如長指標、寬字元等等,在現行的C/C++內比較少用到,但是因為windows api很多都是32位元,所以如果不了解這些資料型態的命名以及它代表的意義,在使用相關函數會遇到看不懂參數的問題。 這些資料型態都有一定的命名規則,例如L代表長,C代表常數等,所以如果把這個命名規則看懂就可以不用記住全部的資料型態,利用IDE的提示功能,就可以把對應的參數放進去。
## 字元型態
字元型態的規則就是C、T、U、W,分別代表常數、UINCODE、unsigned、wchar。
* CHAR => 8-bit, typedef char CHAR;
* CCHAR => 8-bit, typedwf char CCHAR;
* TCHAR => 16-bit, #ifdef UNICODE typedef WCHAR TCHAR; 8-bit, #else typedef char TCHAR;
* UCHAR => 8-bit, typedef unsigned char UCHAR;
* WCHAR => 16-bit, typedef wchar_t WCHAR;
---
### 整數型態
整數型態就比較單純,INT後面接他的位元大小,另外U就是unsigned的意思。
* INT => 32-bit, typedef int INT;
* INT8 => 8-bit, typedef singed char INT8;
* INT16 => 16-bit, typedef signed short INT16;
* INT32 => 32-bit, typedef signed int INT32;
* INT64 => 64-bit, typedef signed _int64 INT64;
* UINT => 32-bit, typedef unsigned int UINT;
* UINT8 => 8-bit, typedef unsigned char UINT8;
* UINT16 => 16-bit, typedef unsigned short;
* UINT32 => 32-bit, typedef unsigned int UINT32;
* UINT64 => 64-bit, typedef unsigned _int64 UINT64;
---
### 整數型態-DWORD
DWORD的完整名稱是Double word,是word的兩倍,命名規則比較單純。
* DWORD => 32-bit, typedef unsigned long DWORD;
* DWORDLONG => 64-bit, typedef unsigned _int64 DWORDLONG;
* DWORD32 => 32-bit, typedef unsigned int DWORD32;
* DWORD64 => 64-bit, typedef unsigned _int64 DWORD64;
---
### 短整數型態
短整數包含BYTE、WORD、SHORT,命名規則一樣是U與T。
* BYTE => 8-bit, typedef unsigned char BYTE;
* TBYTE => 16-bit, #ifdef UNICODE typedef WCHAR TBYTE;
* 8-bit, #else typedef unsigned char TBYTE;
* WORD => 16-bit, typedef unsigned short WORD;
* SHORT => 16-bit, typedef short SHORT;
* USHORT => 16-bit, typedef unsigned short USHORT;
---
### 指標型態-長指標LP
長指標是現在比較少見,但是win32 api很多函數都有用到,定義也都是用現在常用的型態去定義。命名規則比較複雜,但是從下面的說明就可以很清楚的比較出來。
* LPCSTR => 8-bit, typedef _nullterminated CONST CHAR *LPCSTR;
* LPCTSTR => 16-bit, #ifdef UNICODE typedef LPCWSTR LPCTSTR; 8-bit, #else typedef typedef LPCSTR LPCTSTR;
* LPCWSTR => 16-bit, typedef CONST WCHAR *LPCWSTR;
* LPSTR => 8-bit, typedef CHAR *LPSTR;
* LPTSTR => 16-bit, #ifdef UNICODE typedef LPWSTR LPTSTR;
8-bit, #else typedef LPSTR LPTSTR;
* LPWSTR => 16-bit, typedef WCHAR *LPWSTR;
* LPVOID => auto, typedef void *LPVOID;
---
### 字元與字串指標型態
字元與字串的指標型態是用上面的字元型態加上指標來定義,所以也是相對簡單的。
* PBYTE => typedef BYTE *PBTE;
* PCHAR => typedef CHAR *PCHAR;
* PTCHAR => typedef TCHAR *PTCHAR;
* PWCHAR => typedef WCHAR *PWCHAR;
* PCSTR => typedef CONST CHAR *PCSTR;
* PCTSTR => #ifdef UNICODE typedef LPCWSTR PCTSTR;
#else typedef LPCSTR PCTSTR;
* PCWSTR => typedef CONST WCHAR PCWSTR;
* PSTR => typedef CHAR *PSTR;
* PTSTR => #ifdef UNICODE typedef LPWSTR PTSTR;
#else typedef LPSTR PTSTR;
* PWSTR => typedef WCHAR *PWSTR;
### 結語
windows api還有很多特殊的資料型態,例如內核物件的handle,但是也是用int定義的,所以在了解這個之前要把這些基本的搞清楚。在深入win32 api後會遇到很多沒看過的型態,但是這些都是基本的型態用typedef重新定義的,所以瞭解基本的命名規則是必要的。