Windows数据类型探幽—千回百转你是谁?

Windows Data Types

Windows数据类型

 

  由微软Windows操作系统所支持的各种数据类型是用来定义函数的返回值、函数和消息的参数以及结构体成员(因为Win32程序是用C语言来编写,所以没有“类”这个概念)的。这些数据类型定义了上述元素的尺码(在内存中的,也就是占用内存的字节数)和含义。笔者以前一直不太注意这些东西,结果在程序设计时可谓步履维艰。不同类型的常/变量,在程序用扮演的角色相去甚远,了解这些类型,对剖析程序的工作原理是非常有用的。今天又是周末,我把这些类型列出来,然后把它们的“原形”也找出来——是不是很像“照妖镜”呀。

    下面这张表里包括这些类型:字符类型(character),整数类型(integer),逻辑值类型(布尔型,海峡那边的兄弟们喜欢叫“布林型”,Boolean),指针类型(pointer),句柄型(handle)。其中,字符类型、整数类型和逻辑值(布尔)类型是C语言编译器通用的,也就是与标准C语言一样。大多数指针类型都是以PPointer)或者LPLong Pointer)前缀开头。“句柄”是指被装载进内存的一个资源(本质而言就是指一定范围内的唯一编号)。

  下面这张表是我结合MSDN里的资料制作的,因为自己也是初学,做的还比较粗糙,请大家多多指正:)

Windows数据类型

本质类型

字节数

定义过程(来历)

含义

ATOM

unsigned short

2

unsigned shortWORDATOM

Atom表中,一键(16位整数)一值(一个String)为一个Atom

BOOL

int

*

intBOOL

逻辑变量,布尔值 (取值为 TRUE FALSE)

BOOLEAN

unsigned char

1

unsigned charBYTEBOOLEAN

逻辑变量,布尔值 (取值为 TRUE FALSE)

BYTE

unsigned char

1

unsigned charBYTE

字节型,8位。

CALLBACK

__stdcall

调用

__stdcallCALLBACK

回调函数的调用约定

CHAR

char

1

charCHAR

8Windows字符(ANSI

COLORREF

unsigned long

4

unsigned longDWORDCOLORREF

红,绿,蓝(RGB)值

CONST

const

关键字

constCONST

常量

CRITICAL_SECTION

RTL_CRITICAL_SECTION结构体

?

RTL_CRITICAL_SECTION(结构)CRITICAL_SECTION

Critical-section对象

DWORD

unsigned long

4

unsigned longDWORD

32位无符号整数

DWORD_PTR

unsigned long

4

unsigned longULONG_PTRDWORD_PTR(另有其它路径)

……(用处挺大,不过太长了)

DWORD32

unsigned int

*

unsigned intDWORD32

32位无符号整数

DWORD64

unsigned __int64

8

unsigned __int64DWORD64

64位无符号整数

FLOAT

float

4

floatFLOAT

浮点数变量

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__ *HICONHCURSOR

光标的句柄

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 *HANDLEHDWP

Handle to a deferred window position structure.

HENHMETAFILE

HENHMETAFILE__结构体指针

 

DECLARE_HANDLE(name)宏定义……

增强图元文件的句柄

HFILE

int

*

intHFILE

OpenFile(而不是CreateFile)打开的文件的句柄.

HFONT

HFONT__结构体指针

 

DECLARE_HANDLE(name)宏定义……

字体的句柄

HGDIOBJ

void near *

 

void NEAR *HGDIOBJ

GDI对象的句柄

HGLOBAL

void *(一个地址)

 

void *HANDLEHGLOBAL

全局内存块的句柄

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 *HANDLEHLOCAL

本地内存块的句柄

HMENU

HMENU__结构体指针

 

DECLARE_HANDLE(name)宏定义……

菜单的句柄

HMETAFILE

HMETAFILE__结构体指针

 

DECLARE_HANDLE(name)宏定义……

图元文件的句柄

HMODULE

HINSTANCE__结构体指针

 

HINSTANCE__*HINSTANCEHMODULE

模块的句柄。值由模块的位置来决定。

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→BYTEBYTE far *→LPBYTE

BYTE类型的指针

LPCOLORREF

unsigned long *

 

unsigned long→WORDDWORD *→LPCOLORREF

颜色值的指针

LPCRITICAL_SECTION

RTL_CRITICAL_SECTION结构体指针

 

RTL_CRITICAL_SECTION *PRTL_CRITICAL_SECTION→,PRTL_CRITICAL_SECTION→LPCRITICAL_SECTION

CRITICAL_SECTION的指针

LPCSTR

静态char *

 

char→CHARCONST CHAR *→LPCSTR

静态8Windows字符(ANSI)无终结字符串指针

LPCTSTR

静态wchar_t *

 

wchar_t→WCHARCONST WCHAR *→LPCWSTRLPCWSTR→LPCTSTR

如果UNICODE已定义则为LPCWSTR,否则为LPCTSTR

LPCVOID

静态void *

 

CONST void far *→LPCVOID

任何类型的静态指针

LPCWSTR

静态wchar_t *

 

wchar_t→WCHARCONST WCHAR *→LPCWSTR

静态16Windows字符(Unicode)无终结字符串指针

LPDWORD

unsigned long *

 

unsigned long→DWORDDWORD far *→LPDWORD

DWORD的指针

LPHANDLE

指向句柄的指针

 

void *→HANDLEHANDLE FAR *→LPHANDLE

HANDLE的指针

LPINT

int *

 

int far *→LPINT

INT的指针

LPLONG

long *

 

long far *→LPLONG

LONG的指针

LPSTR

char *

 

char→CHARCHAR *→LPSTR

8Windows字符(ANSI)无终结字符串指针

LPTSTR

wchar_t *

 

wchar_t WCHARWCHAR *→LPWSTRLPWSTR→LPTSTR

An LPWSTR if UNICODE is defined, an LPSTR otherwise.

LPVOID

void *

 

void far *→LPVOID

任何类型的指针

LPWORD

unsigned short *

 

unsigned short→WORDWORD far *→LPWORD

WORD的指针

LPWSTR

wchar_t *

 

wchar_t→WCHARWCHAR *→LPWSTR

16Windows字符(ANSI)无终结字符串指针

LRESULT

long

4

_W64 long→LONG_PTR→LRESULT

有符号的消息处理结果

LUID

LUID结构

 

 

局部唯一标识符

PBOOL

int *

 

int→BOOLBOOL near *→PBOOL

BOOL的指针

PBOOLEAN

unsigned char *

 

unsigned char→BYTE→BOOLEANBOOLEAN *→PBOOLEAN

BOOL的指针

PBYTE

unsigned char *

 

unsigned char→BYTEBYTE near *→PBYTE

BYTE的指针

PCHAR

char *

 

char→CHARCHAR *→PCHAR

CHAR的指针

PCRITICAL_SECTION

RTL_CRITICAL_SECTION结构体指针

 

RTL_CRITICAL_SECTION *→PRTL_CRITICAL_SECTIONPRTL_CRITICAL_SECTION→PCRITICAL_SECTION

CRITICAL_SECTION的指针

PCSTR

静态char *

 

char→CHARCONST CHAR *→PCSTR

静态8Windows字符(ANSI)无终结字符串指针

PCTSTR

静态wchar_t *

 

wchar_t→WCHARCONST WCHAR *→LPCWSTRLPCWSTR→PCTSTR

如果UNICODE已定义则为PCWSTR,否则为PCSTR

PCWCH

静态wchar_t *

 

wchar_t→WCHARCONST WCHAR *→PCWCH

WCHAR的静态指针

PCWSTR

静态wchar_t *

 

wchar_t→WCHARCONST WCHAR *→PCWSTR

静态16Windows字符(Unicode)无终结字符串指针

PDWORD

unsigned long *

 

unsigned long→DWORDDWORD near *→PDWORD

DWORD的指针

PFLOAT

float *

 

float→FLOATFLOAT *→PFLOAT

FLOAT的指针

PHANDLE

指向句柄的指针

 

void *→HANDLEHANDLE *→PHANDLE

HANDLE的指针

PHKEY

指向HKEY的指针

 

HKEY__ *→HKEY *→PHKEY

HKEY的指针

PINT

int *

 

int near *→PINT

INT的指针

PLCID

unsigned long *

 

unsigned long→DWORDDWORD near *→PDWORD→PLCID

LCID的指针

PLONG

long *

 

long→LONGLONG *→PLONG

LONG的指针

PLUID

LUID结构体指针

 

LUID *→PLUID

LUID的指针

POINTER_32

void *

 

void *→POINTER_32

32位指针(详解略)

POINTER_64

void *

 

void *→POINTER_64

64位指针(详解略)

PSHORT

short *

 

short→SHORTSHORT *→PSHORT

SHORT的指针

PSTR

char *

 

char→CHARCHAR *→PSTR

8Windows字符(ANSI)无终结字符串指针

PTBYTE

wchar_t *

 

wchar_t→WCHARWCHAR *→PTBYTE

TBYTE的指针

PTCHAR

wchar_t *

 

wchar_t→WCHARWCHAR *→PTCHAR

TCHAR的指针

PTSTR

wchar_t *

 

wchar_t→WCHARWCHAR *→LPWSTR→PTSTR

PWSTR if UNICODE is defined, a PSTR otherwise.

PTBYTE

wchar_t *

 

wchar_t→WCHARWCHAR *→PTBYTE

TBYTE的指针

PTCHAR

wchar_t *

 

wchar_t→WCHARWCHAR *→PTCHAR

TCHAR的指针

PTSTR

wchar_t *

 

wchar_t→WCHARWCHAR *→LPWSTR→PTSTR

A PWSTR if UNICODE is defined, a PSTR otherwise.

PUCHAR

unsigned char *

 

unsigned char→UCHARUCHAR *→PUCHAR

UCHAR的指针

PUINT

unsigned int *

 

unsigned int *→PUINT(呵呵,为什么不用UINT*来定义呢?)

UINT的指针

PULONG

unsigned long *

 

unsigned long→ULONGULONG *→PULONG

ULONG的指针

PUSHORT

unsigned short *

 

unsigned short→USHORTUSHORT *→PUSHORT

USHORT的指针

PVOID

void *

 

void *→PVOID

任何类型的指针

PWCHAR

wchar_t *

 

wchar_t→WCHARWCHAR *→PWCHAR

WCHAR的指针

PWORD

unsigned short *

 

unsigned short→WORDWORD near *→PWORD

WORD的指针

PWSTR

wchar_t *

 

wchar_t→WCHARWCHAR *→PWSTR

16Windows字符(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→WCHARWCHAR→TBYTE

如果UNICODE已定义则为WCHAR,否则为CHAR

TCHAR

wchar_t

2

wchar_t→WCHARWCHAR→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

16Unicode字符

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

  经过十多个小时的奋战,终于完成了:)
  很开心。不过我知道,其中肯定有不完善甚至是错误的地方,请大家多多批评指正,在此先谢过大家。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值