具体描述
本书用大量的实例演示使用Visual C++开发Windows应用程序的相关技术。
全书分为3篇19章,分别是软件设计基础篇、软件设计综合应用篇、Windows系统程序设计篇。内容包括软件开发起步、对话框应用程序、基本控件、文档与视图、GDI绘图技术、键盘与鼠标消息、网络通信基础、密码学算法、多媒体技术、数据库技术、综合实例开发、进程与线程、内存管理、进程间通信、线程同步、动态链接库、结构化异常处理、可执行文件格式(PE)、模块注入与函数挂接技术。
本书适用于Windows程序设计的初学者,也可作为大中专院校相关专业教材。另外,本书还适合稍有基础的Visual C++开发者阅读参考。
作者简介
张静盛,目前在盛大网络从事技术研发工作。自2005至今在看雪软件安全论坛担任“Win32/Win64编程”版版主(网名:北极星2003)。曾获第31届ACM/ICPC国际大学生程序设计竞赛亚洲赛区(上海)银奖。他追求专业技术的精纯,常为工作、为兴趣废寝忘食。
目录信息
前 言
第一篇 软件设计基础篇
第1章 软件开发起步 2
1.1 建立MFC应用程序 2
1.2 分析框架结构 4
1.2.1 框架代码文件的结构 4
1.2.2 应用程序类 5
1.2.3 对话框类 6
1.2.4 添加消息响应 7
第2章 对话框应用程序 9
2.1 模态对话框 9
2.1.1 实例:使用MFC实现模态对话框 9
2.1.2 实例:使用Win32 API实现模态
对话框 10
2.2 非模态对话框 12
2.2.1 实例:使用MFC实现非模态对话框 12
2.2.2 实例:使用Win32 API实现非模态
对话框 13
2.3 属性对话框 14
2.3.1 实例:多页面切换程序 14
2.3.2 实例:向导对话框 16
2.4 对话框设计技巧 17
2.4.1 控件对齐与排列 17
2.4.2 设置控件逻辑顺序 18
2.5 通用对话框 19
2.5.1 实例:通用“打开”和“另存为”
对话框 19
2.5.2 实例:通用“字体”对话框 22
2.5.3 实例:通用“颜色”对话框 23
第3章 基本控件 26
3.1 按钮控件 26
3.1.1 按钮CButton类 26
3.1.2 实例:按钮控件的使用方法 28
3.2 编辑框 30
3.2.1 编辑框CEdit类 30
3.2.2 实例:编辑框的使用方法 32
3.3 列表框 33
3.3.1 列表框CListBox类 33
3.3.2 实例:列表框的使用方法 35
3.4 组合框 36
3.4.1 组合框CComboxBox类 37
3.4.2 实例:组合框的使用方法 39
3.5 进度条 41
3.5.1 进度条CProgressCtrl类 41
3.5.2 实例:进度条的使用方法 42
3.6 列表控件 44
3.6.1 列表控件CListCtrl类 44
3.6.2 实例:列表控件的使用方法 45
第4章 文档与视图 47
4.1 文档—视图结构 47
4.1.1 单文档与多文档 47
4.1.2 文档与视图体系 48
4.2 实例:单文档应用程序与文档串行化 52
第5章 GDI绘图技术 57
5.1 图形设备接口GDI 57
5.1.1 设备上下文 57
5.1.2 GDI对象 58
5.1.3 GDI绘图 58
5.2 画笔 58
5.2.1 画笔CPen类 58
5.2.2 实例:使用GDI对象CPen绘图
示例 59
5.3 画刷 60
5.3.1 画刷CBrush类 60
5.3.2 实例:使用GDI对象CBrush绘图
示例 61
5.4 位图 63
5.4.1 位图CBitmap 63
5.4.2 实例:使用GDI对象CBitmap
示例 64
第6章 键盘与鼠标消息 67
6.1 键盘消息 67
6.1.1 键盘消息的类型 67
6.1.2 实例:响应键盘消息示例 68
6.1.3 模拟键盘消息 70
6.1.4 实例:模拟键盘消息示例 71
6.2 鼠标消息 72
6.2.1 鼠标消息的类型 72
6.2.2 实例:处理鼠标消息 73
6.2.3 实例:模拟鼠标消息 74
第二篇 软件设计综合应用篇
第7章 网络通信基础 80
7.1 网络模型 80
7.1.1 OSI参考模型 80
7.1.2 TCP/IP参考模型 81
7.2 基础协议 82
7.2.1 IP协议 82
7.2.2 TCP协议 83
7.2.3 UDP协议 84
7.2.4 ICMP协议 85
7.3 套接字编程 85
7.3.1 函数介绍 85
7.3.2 实例:Ping程序 88
7.3.3 实例:网络嗅探器 92
7.4 服务器与客户端模型 96
7.4.1 实例:TCP服务端和客户端程序 96
7.4.2 实例:UDP服务器和客户端程序 100
7.5 实例:使用分层服务提供者LSP截取
网络数据包 103
7.5.1 服务提供者接口(SPI) 103
7.5.2 设计实例 103
7.5.3 枚举协议目录 106
7.5.4 LSP的安装与卸载 108
7.5.5 分层服务提供者(LSP) 113
第8章 密码学算法 118
8.1 数据加密标准(DES) 118
8.1.1 算法描述 118
8.1.2 初始置换与逆初始置换 119
8.1.3 生成子密钥 120
8.1.4 f函数的执行流程 121
8.1.5 解密过程 122
8.1.6 实例:DES算法加密解密演示 123
8.2 国际数据加密算法(IDEA) 131
8.2.1 算法描述 131
8.2.2 生成子密钥 133
8.2.3 实例:IDEA算法加密解密演示 134
8.3 Blowfish算法 139
8.3.1 算法描述 139
8.3.2 生成子密钥和S盒 141
8.3.3 实例:Blowfish算法加密
解密演示 141
8.4 公钥加密算法(RSA) 146
8.4.1 算法描述 146
8.4.2 实例:RSA加密解密演示软件 147
第9章 多媒体技术 151
9.1 多媒体控件 151
9.1.1 实例:使用Animation控件播放
AVI文件 151
9.1.2 实例:使用Windows Media Player
控件播放多媒体文件 152
9.1.3 实例:使用Real Player控件播放
多媒体文件 153
9.2 屏幕截图 154
9.2.1 位图 154
9.2.2 实例:屏幕截图 155
9.3 屏幕录像 157
9.3.1 实现原理 157
9.3.2 实例:屏幕录像 158
第10章 数据库技术 161
10.1 设置ODBC数据源 161
10.1.1 ODBC数据源 161
10.1.2 使用ODBC管理器设置Access
数据源 162
10.2 MFC ODBC数据库编程 163
10.2.1 MFC ODBC概述 163
10.2.2 实例:使用MFC ODBC访问
数据库 164
10.3 MFC DAO数据库编程 169
10.3.1 MFC DAO概述 169
10.3.2 实例:使用MFC DAO访问
数据库 169
第11章 综合实例开发 174
11.1 实例:Huffman编码软件 174
11.1.1 Huffman算法原理 174
11.1.2 具体实现 175
11.2 实例:八数码游戏 178
11.2.1 八数码游戏算法介绍 178
11.2.2 具体实现 179
11.3 实例:游戏寻路算法A* 183
11.3.1 A*算法原理 183
11.3.2 二叉堆在A*中的应用 184
11.3.3 具体实现 186
11.4 实例:“连连看”游戏辅助工具 190
11.4.1 “连连看”算法原理 190
11.4.2 具体实现 191
11.5 实例:“对对碰”游戏辅助工具 196
11.5.1 “对对碰”算法原理 196
11.5.2 具体实现 197
11.6 实例:拼音输入法 199
11.6.1 设计实例 200
11.6.2 拼音字典存储结构—Trie树 200
11.6.3 单字联想 205
11.7 实例:Windows二级文件系统 209
11.7.1 设计实例 209
11.7.2 具体实现 211
11.8 实例:手柄测试器 214
11.8.1 DirectInput手柄输入 214
11.8.2 设计实例 216
第三篇 Windows系统程序设计篇
第12章 进程与线程 222
12.1 进程 222
12.1.1 原理介绍 223
12.1.2 创建进程 223
12.1.3 实例:创建进程 226
12.2 线程 227
12.2.1 原理介绍 227
12.2.2 创建线程 229
12.2.3 实例:创建线程 229
12.3 枚举进程/线程信息 231
12.3.1 实例:使用PSAPI示例 231
12.3.2 实例:使用ToolHelpAPI示例 233
12.3.3 实例:使用Native API示例 235
第13章 内存管理 239
13.1 虚拟内存 239
13.1.1 进程虚拟地址空间 239
13.1.2 实例:查看虚拟内存状态 240
13.1.3 实例:演示虚拟内存的“保留—
提交”特性 243
13.1.4 实例:游戏内存修改器 245
13.2 内存映射文件 249
13.2.1 内存映射文件的原理 249
13.2.2 实例:文件分割器 250
第14章 进程间通信 254
14.1 消息传递机制 254
14.1.1 消息传递 254
14.1.2 实例:使用WM_COPYDATA
消息传递数据 254
14.2 共享内存 256
14.2.1 共享内存的原理 256
14.2.2 实例:使用共享内存示例 257
14.3 管道和邮槽 259
14.3.1 管道和邮槽通信原理 259
14.3.2 实例:使用匿名管道重定向
程序输出 261
14.3.3 实例:命名管道示例 263
14.3.4 实例:邮槽通信示例 266
14.4 剪贴板 267
14.4.1 剪贴板通信机制 267
14.4.2 实例:使用剪贴板实现进程间
通信示例 269
第15章 线程同步 275
15.1 原子访问 275
15.1.1 多线程访问共享数据问题 275
15.1.2 互锁系列函数 276
15.2 关键代码段 277
15.2.1 基本原理 277
15.2.2 实例:多线程环境下的数据
共享 278
15.3 内核对象与等待函数 280
15.3.1 内核对象 280
15.3.2 等待函数 281
15.4 事件内核对象 283
15.4.1 基本原理 283
15.4.2 实例:使用事件内核对象示例 284
15.5 等待定时器内核对象 285
15.5.1 基本原理 285
15.5.2 实例:使用等待定时器的APC
机制 287
15.6 信标内核对象 288
15.6.1 基本原理 288
15.6.2 实例:使用信标内核对象示例 289
15.7 互斥内核对象 291
15.7.1 基本原理 292
15.7.2 实例:使用互斥内核对象示例 292
第16章 动态链接库 295
16.1 DLL基础 295
16.1.1 DLL的隐式链接 295
16.1.2 DLL的显示加载 296
16.2 编写动态链接库 297
16.2.1 入口函数DllMain 297
16.2.2 实例:编写DLL实现导出变量、
函数、类 298
16.3 线程本地存储器(TLS) 301
16.3.1 静态TLS和动态TLS 301
16.3.2 实例:使用静态TLS示例 303
16.3.3 实例:使用动态TLS示例 304
第17章 结构化异常处理 306
17.1 SEH的概念、特性 306
17.2 SEH的基本使用方法 307
17.2.1 结束异常程序 307
17.2.2 异常处理程序 310
17.2.3 顶层异常处理 313
17.3 VC++编译器级SEH的具体实现 313
17.3.1 SEH相关数据结构的介绍 314
17.3.2 异常处理链结构图 315
17.3.3 实例:单嵌套异常块演示程序 316
17.3.4 实例:多嵌套异常块演示程序 318
17.3.5 VC++编译器级异常帧结构 320
17.3.6 VC中的顶层异常处理 320
17.3.7 VC搜索异常处理程序流程 322
第18章 可执行文件格式 324
18.1 PE文件格式 324
18.1.1 PE文件头 324
18.1.2 可选文件头 325
18.1.3 区块表 327
18.1.4 输入表 328
18.1.5 输出表 329
18.1.6 资源表 330
18.1.7 重定位表 332
18.1.8 绑定输入表 332
18.2 综合应用 333
18.2.1 实例: PE文件资源查看器 333
18.2.2 实例: 为应用程序添加Nag窗口 337
第19章 模块注入与函数挂接技术 341
19.1 模块注入 341
19.1.1 添加导入表项 342
19.1.2 远程线程技术 344
19.1.3 实例:使用远程线程实现模块
注入 345
19.1.4 异步过程调用(APC) 346
19.1.5 实例:使用APC实现模块注入 347
19.2 挂接API 349
19.2.1 重定向API 350
19.2.2 实例:重定向API MessageBoxA
示例 350
19.2.3 古老的API HOOK 353
19.2.4 实例:HOOK API示例 354
19.2.5 Detours Hook 356
19.2.6 实例:使用detour库实现挂接
API示例 357
19.3 钩子 359
19.3.1 钩子的基本原理 359
19.3.2 钩子类型 360
19.3.3 实例:全局鼠标钩子示例 366
19.3.4 实例:全局键盘钩子示例 369
19.3.5 实例:使用局部CBT钩子示例 370
19.3.6 实例:使用低级键盘钩子示例 371
19.4 反注入技术 372
19.4.1 实例:使用调试钩子屏蔽全局
钩子 372
19.4.2 实例:检测注入模块 374
19.4.3 实例:使用DLL_THREAD_ATTACH
阻止远程线程 377
19.4.4 实例:使用挂钩LoadLibraryExW
屏蔽全局钩子 379
附录 光盘源码实例 381
· · · · · · (收起)
读后感
用户评价
当我翻开这本书时,我的第一印象是,这绝对不是一本迎合当下“快速开发”潮流的快餐读物。它的内容散发着一种对技术根源的尊重与探索欲。我之前接触过一些基于.NET或现代框架的Windows开发,总感觉隔着一层厚厚的封装,对底层的细节一知半解。这本书像是为我搭建了一座“透视桥梁”,让我得以直观地观察到操作系统是如何管理窗口对象的生命周期,如何调度线程的执行,以及各种系统调用背后的开销和机制。特别是对句柄(Handle)和上下文(Context)的深度解析,彻底颠覆了我过去对这些抽象概念的模糊认知。作者在描述这些底层机制时,引用的例子非常贴合实际系统运行环境,让我能够清晰地在脑海中构建出一个虚拟的Windows运行环境模型。这本书的阅读体验是沉浸式的,它要求你保持专注,因为它提供的知识密度非常高,但回报也是巨大的——你将获得一种建立在深刻理解之上的编程能力,而不是依赖框架提供的便捷。对于追求卓越和技术掌控感的开发者来说,这本书是通往“精通”路上不可或缺的里程碑。
坦白讲,这本书的排版和细节处理,体现了作者对读者的极大诚意。我发现书中使用的所有代码示例都是可以完美运行的,而且版本兼容性考虑得相当周全,这在许多老旧的编程教材中是一个巨大的痛点——书上的代码可能需要你花半天时间去修正过时的宏定义或函数签名。这本书则完全避免了这种挫败感。更让我惊喜的是,它对特定Windows版本之间的差异也做了提及和说明,这在处理遗留系统或者需要兼容旧版操作系统的项目中,提供了宝贵的参考价值。它就像是一位经验丰富的导师,不仅告诉你路该怎么走,还提前为你指出了沿途可能出现的各种“陷阱”和“捷径”。通过对这本书的学习,我对于Windows编程的信心有了质的飞跃,它不再是一个充满魔幻色彩的黑箱,而是一个逻辑清晰、规则明确的巨大系统。这本书的价值在于它提供了一种“系统性的思维方式”,它教会我如何以模块化的、面向消息的方式去设计和实现一个健壮的Windows应用程序,而不是零敲碎打地拼凑功能。
我最近一直在寻找一本能够系统梳理Windows API核心概念的书籍,市面上的资料要么是零散的MSDN文档片段,要么就是针对特定框架的教程,真正从“Windows本身”出发讲解的书籍少之又少。幸运的是,我的同事向我推荐了这本《Windows编程循序渐进》,初读便发现它填补了我的一个巨大知识空白。这本书的深度和广度都拿捏得恰到好处。它不仅仅停留在“如何调用函数”的层面,更深入地探讨了资源管理、线程同步,以及内存布局等这些决定程序性能和稳定性的关键要素。我尤其欣赏作者对于错误处理策略的讲解,书中详细剖析了常见的资源泄漏模式和调试技巧,这些都是书本上很少会深入探讨的“工程实践”中的痛点。阅读过程中,我频繁地停下来,不是因为看不懂,而是因为被某些见解所震撼,意识到自己过去很多时候都是在“盲目地写代码”,而不是“有意识地设计程序”。这本书的语言风格非常沉稳有力,带着一种老派工程师特有的严谨和务实,没有过多的花哨修辞,每一个句子似乎都承载着多年的经验结晶。对于那些渴望从“代码搬运工”蜕变为“架构思考者”的读者而言,这本书提供的思维框架的价值,远超代码本身。
这本《Windows编程循序渐进》真是把我从一个对Windows系统底层一窍不通的菜鸟,硬生生打磨成了一个能够独立构建小型应用程序的“老手”。最初拿到这本书的时候,我还有点忐忑,毕竟市面上很多编程书要么过于理论化,堆砌着晦涩难懂的术语,要么就是代码示例老旧过时,根本无法应用到现代的开发环境中。然而,这本书的开篇就展现出了它的不凡之处。作者并没有急于抛出复杂的API调用,而是耐心地从最基础的窗口消息机制、消息循环这些核心概念入手,用清晰、生动的语言将它们描绘出来。那种循序渐进的感觉非常实在,就像是跟着一位经验丰富的老教师,一步步地引导你走进Windows的内部世界。特别是关于GDI绘图的部分,我记得有好几个晚上,我都是对着书上的图例和代码,反复调试,直到屏幕上完美地呈现出我想要的效果,那种成就感是难以言喻的。这本书的结构安排得非常巧妙,它不是简单地罗列知识点,而是将每一个技术模块都嵌入到一个实际的编程场景中去讲解,让你能立刻明白“我为什么要学这个,学了能做什么”。对于想要真正理解Windows是如何“呼吸”和“运作”的开发者来说,这无疑是一本不可多得的入门宝典,它打下的基础,对于后续学习MFC、WPF乃至UWP,都是坚实可靠的垫脚石。
说实话,我是一个极其注重实践反馈的学习者,纯理论的书籍对我来说简直是酷刑。我对《Windows编程循序渐进》最直观的感受是,它简直是为“动手派”量身定做的教科书。书中每一个重要的概念讲解完毕,紧接着就是一套精心设计的练习或小项目。我记得最清楚的是关于进程间通信(IPC)那几章,作者没有直接跳到复杂的命名管道,而是先从最基本的共享内存和消息传递入手,让你亲身体验数据如何在不同的进程空间中安全流动。这种“先打地基,再建高楼”的教学方法,极大地增强了我的自信心。每当遇到棘手的编译错误或者运行时异常,书中的排错章节总能提供立竿见影的思路,它不是直接给出答案,而是教你如何像一个真正的调试员那样去定位问题所在——是句柄泄漏了?还是内存访问违规了?这种培养独立解决问题的能力的训练,比单纯学习语法重要一万倍。这本书的价值就在于,它不仅教会你“怎么做”,更重要的是教会你“为什么这样做才是对的”,这才是技术深度的体现。