学习windows编程时你会发现有很多没见过的数据,这些数据类型基本都是大写的,对于只习惯于int,char等基本数据类型的新手程序员来说,看到这些乱七八糟的数据类型简直就是噩梦。但其实微软定义这些数据类型是为了帮助程序员开发。所以,如果你仔细研读这些数据类型的话,你就会慢慢喜欢上它们,因为它们够直接,够直观,够实用。
通过查看这些数据类型的定义你会发现其实它们并不是什么很神秘的东西,其实就是int这些基本数据类型的重定义而已。本帖本着笔记的初衷,会不断收集我学习过程中接触到的win32数据类型。
#ifndef VOID
#define VOID void
typedef char CHAR;
typedef short SHORT;
typedef long LONG;
#if !defined(MIDL_PASS)
typedef int INT;
#endif
#endif
这几个类型只是简单的变为大写而已,意义和原来的基本类型没什么两样。#define,#ifndef,#endif,#if等是C语言中的预处理,它们是在编译预处理的时候执行,不会被编译到代码中。
typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;
typedef LONG_PTR LRESULT;
typedef _W64 int INT_PTR, *PINT_PTR;
typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;
typedef _W64 long LONG_PTR, *PLONG_PTR;
typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;
WPARAM 是UINT_PTR,表示无符号整型;LPARAM是LONG_PTR,表示长整型;LRESULT其实跟LPARAM一样,只是为了更直观地表示其作用,表征其是窗口过程函数的返回值。
再看这几个*_PTR,一开始看到以为是指针类型,但其实不是,指针类型是在最前面加个P,以_PTR为后缀只是表示这种数据类型用于保存指针值。
INT_PTR保存int型指针 ,具体位数看机器的自然长度。在16位系统上是2个字节16位,在32位和64位系统上是4个字节32位。
UINT_PTR保存unsigned int型指针,无符号整型。
LONG_PTR保存long型指针,在32位和16位机器上是4个字节32位,在64位机器上8个字节64位。
ULONG_PTR保存unsigned long型指针,无符号长整型。
INT_PTR对应的指针是PINT_PTR,UINT_PTR对应的指针类型是PUINT_PTR,LONG_PTR对应的指针类型是PLONG_PTR,ULONG_PTR对应的指针类型是PULONG_PTR。
lstrlen用于获取字符串长度,在64位下表示lstrlenW,在32位下表示lstrlenA。
下面看一下在windows api经常出现的lp,lpc,p。
p代表指针,lp代表长指针,lpc代表长常指针。c一般指常量。
typedef FLOAT *PFLOAT;
typedef BOOL near *PBOOL;
typedef BOOL far *LPBOOL;
typedef BYTE near *PBYTE;
typedef BYTE far *LPBYTE;
typedef int near *PINT;
typedef int far *LPINT;
typedef WORD near *PWORD;
typedef WORD far *LPWORD;
typedef long far *LPLONG;
typedef DWORD near *PDWORD;
typedef DWORD far *LPDWORD;
typedef void far *LPVOID;
typedef CONST void far *LPCVOID;
只要知道了这三个前缀的意思,这些数据类型就很容易理解了。