(一)Windows编程概述
1、Windows API简介
2、Windows应用程序开发入门
2.1、第一个实例程序
3、Windows API概要
3.1、Windows数据类型
3.2、Windows API的功能分类
4、Windows API核心DLL
5、Unicode和多字节
5.1、字符串类型与其初始化
5.2、W版本和A版本的API
5.3、Unicode和ASCII的转换
6、Windows程序设计规范的建议
7、集成开发环境Visual Studio
Visual Studio常用快捷键
1、Windows API简介
Windows API(Windows Application Program Interface,应用程序接口)是一系列接口函数、宏、数据类型、数据结构的集合,运行于Windows操作系统的应用程序可以使用其提供的接口来实现应用程序所要的功能。
2、Windows应用程序开发入门
Windows应用程序开发的核心是使用Windows SDK(Software Development Kit,软件开发工具包)所提供的API。
2.1、第一个实例程序
#include <windows.h>
#pragma comment(lib,"user32.lib")
int WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, INT nCmdShow)
{
MessageBox(NULL, TEXT("消息内容"), TEXT("消息标题"), MB_OK);
return 0;
}
代码讲解之:预编译声明:
#include <windows.h>
//windows.h是Windows应用程序开发中常用的头文件,在Windows应用程序开发中所使用的很多的数据类型、结构、API接口函数都在windows.h或windows.h所包含的其他头文件中进行了声明。
#pragma comment(lib,"user32.lib")
//指明将源文件编译生成目标文件(.obj)后,将目标文件链接成可执行文件的过程中需要使用到User32.lib,因为User32.lib中包含了MessageBox的链接信息。
代码讲解之:程序入口点(WinMain函数,相当于C语言的main函数):
int WinMain
(
HINSTANCE hInstance, //表示应用程序本次运行实例的句柄
HINSTANCE hPrevInstance, //表示应用程序之前运行实例的句柄,在实际应用中,此参数始终为NULL
PWSTR lpCmdLine, //运行时参数,如在cmd命令行中运行"start.exe Commond Arguments",那么lpCmdLine就指向字符串"Commond Arguments",作用与C语言中main函数的参数作用类似
int nCmdShow //表示应用程序窗口(如果有)的显示状态
);
代码讲解之:MessageBox函数:
int MessageBox
(
HWND hWnd, //消息框所属的窗口的句柄,可以设置为NULL
LPCTSTR lpText, //字符串,表示消息框所显示的消息
LPCTSTR lpCaption, //字符串,表示消息框的标题
UINT uType //消息框的类型
);
3、Windows API概要
3.1、Windows数据类型
Windows使用了很多自己定义的数据类型,这些Windows数据类型都是从标准C的数据类型经过类型重定义而来,在SDK的相关头文件中有定义。
常用的基本Windows数据类型 | |
类型 | 描述 |
BOOL | 布尔型变量,值为True或False |
BYTE | 字节类型(8位) |
CHAR | 8比特字节(ANSI) |
CONST | 常量,相当于标准C中的Const关键字 |
DWORD | 32字节无符号整型数据 |
DWORD32 | 32字节无符号整型数据 |
DWORD64 | 64字节无符号整型数据 |
FLORT | 浮点数据类型 |
HANDLE | 对象的句柄,最基本的句柄类型 |
HICON | 图标的句柄 |
HINSTANCE | 程序实例的句柄 |
HKEY | 注册表键的句柄 |
HMODULE | 模块的句柄 |
HWND | 窗口的句柄 |
INT | 32位符号整数数据类型 |
INT_PTR | 指向INT类型数据的指针类型 |
LPVOID | 无类型指针,相当于void* |
INT32 | 32位符号整型 |
INT64 | 64位符号整型 |
LONG | 32位符号整型,相当于C语言的标准数据类型long |
LONGLONG | 64位符号整型 |
LONG32 | 32位符号整型 |
LONG64 | 64位符号整型 |
LPARAM | 消息的L参数 |
WPARAM | 消息的W参数 |
LPCSTR | Windows(ANSI)字符串常量 |
LPCTSTR | 根据环境配置,如果定义了UNICODE宏,则是LPCWSTR类型,否则是LPCSTR类型 |
LPCWSTR | UNICODE字符串常量 |
LPDWORD | 指向DWORD类型数据的指针 |
LPSTR | Windows(ANSI)字符串变量 |
LPTSTR | 根据环境配置,如果定义了UNICODE宏,则是LPWSTR类型,否则是LPSTR类型 |
LPWSTR | UNICODE字符串变量 |
SHORT | 无符号短整型(16位) |
SIZE_T | 表示内存大小,以字节为单位,其最大值是CPU最大寻址范围 |
TCHAR | 如果定义了UNICODE,则为WCHAR,否则为CHAR |
UCHAR | 无符号CHAR |
UINT | 无符号INT |
ULONG | 无符号LONG |
VOID | 空类型,相当于C语言的void |
WCHAR | 16位UNICODE字符 |
WINAPI | Windows API的函数调用方式,常见于SDK头文件中对API函数的声明中,是一种函数调用约定 |
WORD | 16位无符号整型数据 |
Windows数据类型命名规律:
指针类型的命名:在其指向的数据类型前加“LP”或“P”
句柄类型的命名:对象名前加“H”
无符号类型的命名:在数据类型前加“U”
3.2、Windows API的功能分类
系统基本服务:文件系统、内存管理、进程、线程和模块、设备I/O、驱动程序控制、Windows系统消息、进程间通信、定时器与消息机制、其他(性能监视、电源管理、索引与数据存储等)。
系统管理
用户界面:窗口化、资源、数据交换、Windows图形界面通用控件、Windows shell
图像和多媒体
网络
系统安全
其他功能:数据存储和访问、数据库、消息与协作、Web开发等
4、Windows API核心DLL
在Windows的系统目录中,存在着很多的动态链接库文件(DLL)文件,这些DLL文件中包括了Windows API函数可执行程序。DLL将各函数“导出”,这样应用程序就可以找到DLL中的函数地址,当应用程序调用Windows API时,程序会运行到DLL中。
在应用程序调用一个API前,操作系统会通过程序文件(exe)中的导入表结构找到需要调用的API函数位于哪个DLL,并确定函数在内存中的地址,应用程序才可以成功调用API函数。
Windows系统的C标准库函数接口主要由crtdll.dll导出。实际上,C标准函数库必须由操作系统为其提供接口,否则使用标准C开发的程序无法在特定的系统上运行。
存放主要API函数的几个核心DLL:
Kernel32.dll:最重要的DLL,Windows系统最主要的系统服务API函数都存在于Kernel32.dll
User32.dll:主要包括图形用户界面中所用到的一些函数接口
GDI32.dll:主要包括Windows图形引擎中的接口函数
5、Unicode和多字节
Windows既可以使用Unicode字符集又可以使用传统的字符集(比如多字节编码)来实现对各种语言的支持以适应国际市场的要求。
与传统的字符集编码相比,Unicode是世界通用的字符编码标准,使用16位数据表示一个字符,一共可以表示65535种字符,可以包含现代计算机中所使用的所有字符,包括各种字母、文字、在出版业中使用的特殊符号等。
传统的字符集如Windows ASNI字符集,使用了8位数据或将相邻的两个8位的数据组合在一起表示特殊的语言字符,Windows系统采用了ASNI字符的扩展方式,如果一个字节是负数,则将其后续的一个字节组合在一起表示一个字符。这种编码的字符集也称作“多字节”字符集。
在Windows系统中,Unicode字符编码和多字节字符编码都可以使用。
5.1、字符串类型与其初始化
类型 | 变量类型 | 初始化方式 |
Unicode | LPWSTR | L"string" |
多字节 | LPSTR | "string" |
根据开发环境自动适应 | LPTSTR | TEXT("string") |
5.2、W版本和A版本的API
Windows支持Unicode和ASCII编码的字符,Windows系统API凡是以字符串作为参数的,很多都具有W和A两个版本以实现两种不同编码的字符处理。
A:以多字节字符串作为参数输入
W:以Unicode字符串作为参数输入
不带A或W的API函数:配合TEXT("string")的初始化方式,会根据编译条件自动选择A版本或W版本的API函数,以采取相适应的字符串类型为参数。
5.3、Unicode和ASCII的转换
Windows专门提供了若干个API用来实现对字符编码的转换工作:
WideCharToMultiByte:将Unicode字符串转换为多字节字符串以适应A版本的API
MultiByteToWideChar:将多字节字符串转换为Unicode字符串,以适应W版本的API
6、Windows程序设计规范的建议
变量名:匈牙利命名法。变量名由“类型缩写(小写)”+“变量描述(每个单词首字母大型)”构成,如:
字符串类型的变量命名为:szFileName;
DWORD类型的数据命名为:dwFileSize;
指针类型命名为:lpBuffer;
句柄类型的变量命名为:hLogFile等。
函数名:每个单词的首字母大写,其余字母小写。
类型名:全大写,各单词用下划线分隔。
常量:全大写,各单词用下划线分隔。
宏:多与类型名命名方式相同,有时也与函数名命名方式相同。
大括号与代码段:一般大括号独立占一行,大括号内的代码段缩进,如果代码段仅一行(如if-else后的语句),也建议使用大括号,一般多于三个参数的函数都需要分行写,每个参数写一行。
7、集成开发环境Visual Studio
Visual Studio常用快捷键
显示代码提示:Alt+➡
开始调试:F5
转到指定行:Ctrl+G
转到定义:F12
查找:Ctrl+F
参考资料:
[1] 范文庆、周彬彬、安靖.Windows API开发详解——函数、接口、编程实例[M].北京:人民邮电出版社,2011:1-72.