Windows 编程中使用的一些基本术语和编码约定
什么是Win32 API?
简单来讲,就是微软为了保护操做系统的安全性和稳定性,不容许运行在用户层的进程随意操控系统内核,而是必须按照必定方式。咱们用户层要与系统内核层交互(好比对内存、进程操做),只能经过调用Windows内核层提供的接口函数,也就是Win32API来操控。这些API以DLL(动态连接库)的形式保存(在SYSTEM32文件夹中,你能够发现许多DLL文件),最经常使用的是kernel32.dll、user32.dll和gdi32.dll。
全部基于NT内核(XP到Win10都是基于NT内核开发)的Windows API均可以称为Win32,即使是64位系统,也用这个名称,由于64位系统是彻底兼容32位程序的(32位系统不能彻底兼容16位程序),因此你能够看到这些DLL名称都有个”32”的后缀。那咱们用C/C++写程序,没用到Win32,怎么也可以执行分配内存,打开进程等操做呢?实际上在Windows系统上的C/C++的运行库内部也是封装了Win32API。进一步说,全部运行在Windows用户层的程序必须得调用Win32API。
Windows采用分层结构,大体来讲就是(用户层->内核层->硬件抽象层->硬件层),每一层使用下一层提供的接口来与下一层进行交互。咱们平常使用的应用程序都是运行在用户层,经过调用内核层提供的接口(Win32API)来与内核层交互,而后系统会请求中断(调用nt*.dll函数),调用内核中的中断服务程序,进而对硬件抽象层进行操做,从而实现用户到硬件的交互。固然,也有许多程序是运行在内核层的(好比驱动程序),Windows没有公布用于内核层编程的源码,可是提供了WDK(Windows Driver Kit)来给程序员编写驱动程序,驱动程序可经过内核API,编写中断服务例程来操控硬件抽象层。
为何要学Win32 API?
如今用于windows平台的程序开发方式突飞猛进,种类繁多,好比使用Dephi、WPF、Qt等,开发效率远高于使用Win32 API开发,那为何还要学习使用Win32 API开发呢?
- 理解Windows程序底层运行机制。
- 帮助学习Windows上其余的编程语言、平台。
- 实现其余库没有提供的高级功能,好比修改其余进程内存等。
开始前你必须知道
语言基础: C/C++
开发平台: Visual Studio
编码格式:Unicode
为何区分编码格式?
windows程序的编码格式分为两种:ANSI(MBCS:多字节字符集)和Unicode,Windows会按程序的编码格式解码字符。
ANSI:根据系统当前设置的语言采用不一样编码,好比系统语言设置为简体中文,则ANSI采用GBK编码。
Unicode:统一的字符集,在全部系统中均相同,每一个字符占用两个字节。
为何使用Unicode?
- Windows NT是使用Unicode开发的,调用API时要把ANSI字符转换成Unicode字符,直接使用Unicode能够提升运行效率。
- 使你的程序在不一样语言的系统上运行时不会出现乱码。
- 一些API只能处理Unicode字符。
怎么设置Unicode?
修改编译器设置
项目->属性->高级->字符集:使用Unicode字符集
设置后观察
项目->属性->C/C++->命令行:看到两个选项 /D “_UNICODE” /D “UNICODE”,说明已成功设置为Unicode编码,不然看到选项 /D “_MBCS”,说明使用的是MBCS编码。
其中_UNICODE定义在C运行库的头文件中,UNICODE定义在Windows的头文件中。
尽可能使用Windows数据类型
在平时使用C/C++编程时,咱们都使用C/C++标准库提供的数据类型,好比char,shot,int,long int等等,可是在使用Windows API编程时,咱们应该尽可能使用Windows提供的数据类型,由于Win32 API函数都是使用Windows数据类型编写的,因此你必需要认识它。事实上,这些Windows数据类型都是在windows头文件中对C/C++库原生类型的宏定义,本质上并没有差异。下面列举常见的Windows数据类型。
类型前缀
c=const 常量
u=unsigned 无符号
p=pointer 指针
h=handle 句柄
w=word 字
dw=double word 双字
sz=strinszg terminated with a zero 以0结尾的字符串
lp=long pointer 长指针
函数后缀
A=ansi字符 参数接受ANSI字符
W=wide宽字符 参数接受Unicode字符
EX=expand 扩展版函数,在原函数基础上增长某些新的特性
Windows类型举例
1 | typedef int INT; |
其余定义详见 <minwindef.h>near指针NP,far指针FP,long指针LP,是为了兼容16位程序,在32位编程中都为P(32位指针)
在字符串前添加 L标志
该字符串将按宽字符(Unicode)编码
TEXT、__TEXT(winnt.h内定义的宏)
若是 UNICODE被定义,则在字符串前添加L
_T、__T、_TEXT(tchar.h内定义的宏)
若是 _UNICODE被定义,则在字符串前添加L
1 |
带T前缀的数据类型
根据是否定义UNICODE选择使用宽/窄字符
1 |
|