Windows 程序设计
王艳平 编著
人民邮电出版社
图书在版编目(CIP)数据
Windows 程序设计/王艳平编著. —北京:人民邮电出版社,2005.3
ISBN 7-115-13205-4
Ⅰ. W… Ⅱ. 王… Ⅲ. 窗口软件,Windows—程序设计 Ⅳ. TP316.7
中国版本图书馆 CIP 数据核字(2005)第 019046 号
内 容 简 介
本书编写的目的是为学习 Windows 编程的读者提供一个良好的学习方法,循序渐进,最终使他们从根本
上提高编程水平,有能力独立开发出像 Windows 防火墙一样复杂的应用程序。本书首先介绍了 Win32 程序运
行原理和最基本的 Win32 API 编程,然后通过模拟 MFC 中关键类、全局函数和宏定义的实现详细讲述了框架
程序的设计方法和 MFC 的内部工作机制,并指出了这些机制是如何对用户程序造成影响的,最后完整讲述了
开发内核驱动和 Windows 防火墙的过程。
全书语言严谨流畅,针对初学者的特点,精心策划、由浅到深,是学习 Windows 编程的理想书籍。
Windows 程序设计
编
著 王艳平
责任编辑 刘 浩
人民邮电出版社出版发行
北京市崇文区夕照寺街 14 号
邮编 100061 电子函件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者热线 010-67132692
北京密云春雷印刷厂印刷
新华书店总店北京发行所经销
开本:787×1092 1/16
印张:28.5
字数:696 千字
印数:1 – 5 000 册
2005 年 3 月第 1 版
2005 年 3 月北京第 1 次印刷
ISBN 7-115-13205-4/TP·4535
定价:49.00 元(附光盘)
本书如有印装质量问题,请与本社联系 电话:(010)67129223
生活话题 & 阅读体验 & E书共享 & 影音交流 QQ群As a reader(74398380)生活 读书 新知
前 言
许多人在刚开始接触 Windows 编程时,从 Visual Basic 开始,从 MFC 开始,虽然写出了
程序,但他们自己都不知道程序是如何运行的,从而造成写程序“容易”修改难,设计程序“容
易”维护难的状况。本书是为 Windows 程序设计的初学者和想从根本上提高自己编程水平的
爱好者们编写的,试图使他们成为编程高手。
API 函数是 Windows 提供给应用程序的编程接口,任何用户应用程序必须运行在 API 函
数之上。直接使用 API 编程是了解操作系统运行细节的最佳方式,而且熟知 API 函数也是对
程序开发者的一个最基本的要求。本书将以 API 函数作为起点介绍 Windows 编程,这样做的
好处是使读者撇开 C++的特性专心熟悉 Win32 编程思路和消息驱动机制。
但是,在开发大型系统的时候,往往并不完全直接使用 API 函数,而是使用 MFC 类库框
架程序。MFC 对 90%以上的 API 函数进行了面向对象化包装,完全体现了对象化程序设计的
特点,是目前流行的类库。
当读者熟悉最基本的 API 函数编程以后,就可以学习更高级的 MFC 编程了。但是,虽然
MFC 仅仅是对 API 函数的简单封装,由于读者对 C++语言的了解不够,不清楚框架程序的工
作机制,即便是有经验的程序员在 MFC 复杂的结构面前也显得非常困惑。他们会“用”MFC,
却不知道为什么这么“用”,在运行程序出错时这种现象带来的问题就很明显,他们不会改。
面对一个大的项目,代码往往需要手工添加和修改,而很少能够依靠 VC++的向导。为此,
本书将从开发者的角度同读者一起来设计 MFC 中的类、函数和宏定义。通过对 MFC 类库的
分析和了解,不仅能够使读者更好地使用 MFC 类库,同时,对于自己设计和实现框架和类,
无疑也有相当大的帮助。
之后,本书讲述了 Windows 系统编程中当前最为热门的话题——DLL 注入技术、远程进
程技术、HOOK API 技术等,并配有完整而具体的实例。
本书的最后将讨论 Windows 内核驱动程序设计和防火墙开发。这对于全面了解 Windows
操作系统的结构体系,学习独立开发应用软件是非常有帮助的。
—— 内容安排
《Windows 程序设计》从“Hello,World”这个简单的例子出发,通过多个实例,由浅入
深地讲述 Win32 API 程序设计、类库框架设计、MFC 程序设计、内核模式程序设计等,使读
者在实践中熟练掌握 Windows 程序设计模式,并有能力写出完成特定功能的用户应用程序和
简单的内核驱动程序。
第 1 章(Windows 程序设计基础)写给从未接触过 Windows 程序的读者,使读者的知识
符合本书的要求。
第 2~4 章(Win32 程序运行原理、Win32 程序的执行单元、Windows 图形界面)详细介绍
SDK 编程,这是 Windows 下最基本的编程方式,它是依靠直接调用 API 函数来编写 Windows
应用程序的。
第 5~7 章(框架管理基础、框架中的窗口、用户界面设计)中,笔者将和读者一起设计
自己的“类库”,这个小“类库”是 MFC 的一个缩影,它将 MFC 中核心的东西,如运行期信
Windows 程序设计
息、线程/模块状态、消息映射、内存管理等都非常清晰地体现了出来。在封装 API 的时候,
作者详细介绍了 C++语言中虚函数、静态函数、继承和类模板等高级特性的具体应用,叙述
了框架程序管理应用程序的每一个细节,用各种精彩的实例介绍如何进行对象化程序设计,如
何使用 MFC 类库简化开发周期。整个过程就是深入了解对象化程序设计模式的过程,也是彻
底明白 MFC 内部工作机制的过程。
第 8~11 章(Windows 文件操作和内存映射文件、动态链接库和钩子、TCP/IP 和网络通信、
内核模式程序设计与 Windows 防火墙开发)通过对各种实例的剖析详细讨论 Windows 的高级
特性,使读者在实践中提高自己的编程水平。
—— 对读者的假设
(1)读者应该熟知 C 编程语言。本书的 SDK 程序设计部分使用了 C 语言格式的例子演
示 Win32 程序运行原理和 API 编程的细节。
(2)读者应该懂得 C++语言的基础知识,像简单的类的封装和对象的概念等。在这个基
础上本书会详细介绍 C++的高级特性以设计和实现自己的框架和类。
(3)可视化编程的经验是有用的。如果读者曾接触过 VB、PB 或 MFC 等工具,将会更
容易理解 Win32 程序的结构和 Windows 的消息驱动。
(4)本书不再假设读者有任何 Windows 编程经验和其他程序设计语言的知识。
—— 关于附书光盘和读者反馈
配套光盘包含 3 个文件夹:
此文件夹下包含本书涉及的所有 VC++工程(共 77 个,工程名称前缀 01、02、
03 等说明了是哪一章的程序),将这些工程代码拷贝到硬盘上,然后直接用 VC++ 6.0 或者
VC++ .NET 打开,即可正确编译连接。
<驱动程序向导> 此文件夹下包含开发驱动程序所需的模板向导 DriverWizard.awx,将之复制到
VC++ 安装目录的“...\Microsoft Visual Studio\Common\ MsDev98\Template”文件夹下即可使用。
此文件夹下包含美化界面工具 SkinMagic 的安装程序 setup.exe,运行它即可
将 SkinMagic 2.11 版安装到电脑上。
本书附书光盘中可以找到全部例子源代码,代码全部使用 Visual C++6.0 编译通过。虽然
本书中的所有的例子都已经在 Windows 98、Windows 2000 和 Windows XP 下测试通过,但由
于许多工程比较复杂,也有存在 Bug 的可能,如果发现代码存在的错误或者发现书中的其他
问题,请告知作者(book_better@sohu.com),以便在下一版中改进。
—— 致谢
感谢我的朋友,重庆万博软件有限公司的杨长元先生,你为我提供了一些很有价值的代码
及最新的技术资料,并很有耐心地帮我调试了一些程序代码。
感谢好友冯利娜女士,在我不顺利时,你安慰、鼓舞并支持我。
同时,也感谢韩松、马伟波、陈志强等河北理工大学、天津大学的工作人员,你们给了我
莫大的生活上的照顾,提出了许多宝贵的意见和建议。
作者
2005
年 3 月
– 2 –
目 录
第 1 章 Windows 程序设计基础 .................................................................................... 1
1.1 必须了解的东西..........................................................................................................1
1.1.1 Windows 产品概述 ..........................................................................................1
1.1.2 开发工具 Visual C++ .......................................................................................1
1.1.3 Windows 资料来源——MSDN .......................................................................2
1.1.4 Win32 API 简介................................................................................................2
1.2 用 Visual C++的基本用法 ..........................................................................................2
1.2.1 应用程序的类型...............................................................................................3
1.2.2 第一个控制台应用程序...................................................................................3
1.2.3 API 函数的调用方法 .......................................................................................4
1.3 本书推荐的编程环境..................................................................................................5
1.4 代码的风格..................................................................................................................6
1.4.1 变量的命名.......................................................................................................6
1.4.2 代码的对齐方式...............................................................................................7
1.4.3 代码的注释.......................................................................................................8
第 2 章 Win32 程序运行原理 ......................................................................................... 9
2.1 CPU 的保护模式和 Windows 系统............................................................................9
2.1.1 Windows 的多任务实现...................................................................................9
2.1.2 虚拟内存...........................................................................................................9
2.1.3 内核模式和用户模式.....................................................................................10
2.2 内核对象 ................................................................................................................... 11
2.2.1 内核对象的引出............................................................................................. 11
2.2.2 对象句柄.........................................................................................................12
2.2.3 使用计数.........................................................................................................12
2.3 进程的创建................................................................................................................12
2.3.1 进程(Process)和线程(Thread) .............................................................12
2.3.2 应用程序的启动过程.....................................................................................13
2.3.3 CreateProcess 函数 .........................................................................................14
2.3.4 创建进程的例子.............................................................................................17
2.4 进程控制 ...................................................................................................................18
2.4.1 获取系统进程.................................................................................................18
2.4.2 终止当前进程.................................................................................................20
Windows 程序设计
2.4.3 终止其他进程.................................................................................................21
2.4.4 保护进程.........................................................................................................22
2.5 【实例】游戏内存修改器........................................................................................23
2.5.1 实现原理.........................................................................................................23
2.5.2 编写测试程序.................................................................................................25
2.5.3 搜索内存.........................................................................................................25
2.5.4 写进程空间.....................................................................................................28
2.5.5 提炼接口.........................................................................................................28
第 3 章 Win32 程序的执行单元................................................................................... 30
3.1 多线程 .......................................................................................................................30
3.1.1 线程的创建.....................................................................................................30
3.1.2 线程内核对象.................................................................................................33
3.1.3 线程的终止.....................................................................................................36
3.1.4 线程的优先级.................................................................................................37
3.1.5 C/C++运行期库..............................................................................................40
3.2 线程同步 ...................................................................................................................41
3.2.1 临界区对象.....................................................................................................41
3.2.2 互锁函数.........................................................................................................44
3.2.3 事件内核对象.................................................................................................45
3.2.4 线程局部存储(TLS)..................................................................................47
3.3 设计自己的线程局部存储........................................................................................50
3.3.1 CSimpleList 类 ...............................................................................................51
3.3.2 CNoTrackObject 类 ........................................................................................57
3.3.3 CThreadSlotData 类........................................................................................58
3.3.4 CThreadLocal 类模板.....................................................................................67
3.4 设计线程类——CWinThread ...................................................................................71
3.5 【实例】多线程文件搜索器....................................................................................80
3.5.1 搜索文件的基本知识.....................................................................................81
3.5.2 编程思路.........................................................................................................83
第 4 章 Windows 图形界面 ........................................................................................... 90
4.1 了解窗口 ...................................................................................................................90
4.2 第一个窗口程序........................................................................................................91
4.2.1 创建 Win32 工程和 MessageBox 函数 .........................................................91
4.2.2 Windows 的消息驱动.....................................................................................93
4.2.3 创建窗口.........................................................................................................94
4.2.4 分析主程序代码.............................................................................................96
4.2.5 处理消息的代码...........................................................................................100
4.3 一个“简陋”的打字程序......................................................................................102
– 2 –
目录
4.3.1 使用资源.......................................................................................................102
4.3.2 菜单和图标...................................................................................................104
4.3.3 接收键盘输入...............................................................................................105
4.3.4 接收鼠标输入...............................................................................................108
4.3.5 设置文本颜色和背景色...............................................................................109
4.4 GDI 基本图形 .........................................................................................................109
4.4.1 设备环境(Device Context)......................................................................109
4.4.2 Windows 的颜色和像素点...........................................................................112
4.4.3 绘制线条....................................................................................................... 113
4.4.4 绘制区域....................................................................................................... 117
4.4.5 坐标系统....................................................................................................... 118
4.5 【实例】小时钟......................................................................................................122
4.5.1 基础知识——定时器和系统时间...............................................................122
4.5.2 时钟程序.......................................................................................................125
4.5.3 移动窗口.......................................................................................................129
4.5.4 使用快捷菜单...............................................................................................130
第 5 章 框架管理基础...................................................................................................134
5.1 运行时类信息(CRuntimeClass 类)....................................................................134
5.1.1 动态类型识别和动态创建...........................................................................134
5.1.2 DECLARE_DYNAMIC 等宏的定义 ..........................................................139
5.2 调试支持 .................................................................................................................141
5.2.1 基本调试方法...............................................................................................141
5.2.2 调试输出.......................................................................................................142
5.2.3 跟踪和断言...................................................................................................143
5.3 框架程序中的映射..................................................................................................144
5.3.1 映射的概念...................................................................................................144
5.3.2 内存分配方式...............................................................................................145
5.3.3 设计管理方式...............................................................................................148
5.3.4 句柄映射的实现...........................................................................................155
5.4 框架程序的状态信息..............................................................................................156
5.4.1 模块的概念...................................................................................................156
5.4.2 模块、线程的状态.......................................................................................157
5.5 框架程序的执行顺序..............................................................................................159
5.5.1 线程的生命周期...........................................................................................159
5.5.2 程序的初始化过程.......................................................................................162
5.5.3 框架程序应用举例.......................................................................................165
第 6 章 框架中的窗口...................................................................................................166
6.1 CWnd 类的引出 ......................................................................................................166
– 3 –
Windows 程序设计
6.2 窗口句柄映射..........................................................................................................167
6.2.1 向 CWnd 对象分发消息 ..............................................................................167
6.2.2 消息的传递方式...........................................................................................170
6.3 创建窗口 .................................................................................................................172
6.3.1 窗口函数.......................................................................................................172
6.3.2 注册窗口类...................................................................................................173
6.3.3 消息钩子.......................................................................................................175
6.3.4 最终实现.......................................................................................................180
6.3.5 创建窗口的例子...........................................................................................182
6.4 消息映射 .................................................................................................................184
6.4.1 消息映射表...................................................................................................184
6.4.2 DECLARE_MESSAGE_MAP 等宏的定义 ................................................187
6.5 消息处理 .................................................................................................................189
6.5.1 使用消息映射宏...........................................................................................189
6.5.2 消息的分发机制...........................................................................................192
6.5.3 消息映射应用举例.......................................................................................195
6.6 使用 Microsoft 基础类库........................................................................................199
6.7 【实例】窗口查看器..............................................................................................201
6.7.1 窗口界面.......................................................................................................201
6.7.2 获取目标窗口的信息...................................................................................206
6.7.3 自制按钮.......................................................................................................210
第 7 章 用户界面设计...................................................................................................214
7.1 对话框与子窗口控件基础......................................................................................214
7.1.1 子窗口控件运行原理...................................................................................214
7.1.2 对话框工作原理...........................................................................................217
7.2 使用对话框和控件与用户交互..............................................................................219
7.2.1 以对话框为主界面的应用程序...................................................................219
7.2.2 常用子窗口控件...........................................................................................223
7.2.3 对话框与控件的颜色...................................................................................224
7.3 通用控件 .................................................................................................................225
7.3.1 通用控件简介...............................................................................................225
7.3.2 使用通用控件...............................................................................................226
7.3.3 使用状态栏...................................................................................................230
7.3.4 使用列表视图...............................................................................................231
7.3.5 使用进度条...................................................................................................233
7.4 通用对话框..............................................................................................................235
7.4.1 “打开”文件和“保存”文件对话框.......................................................235
7.4.2 浏览目录对话框...........................................................................................237
– 4 –