第一部分 程序员必读
第1章 对程序错误的处理
1.1 定义自己的错误代码
1.2 ErrorShow示例应用程序
第2章 Unicode
2.1 字符集
2.2 为什么使用Unicode
2.3 Windows 2000与Unicode
2.4 Windows 98与Unicode
2.5 Windows CE与Unicode
2.6 需要注意的问题
2.7 对COM的简单说明
2.8 如何编写Unicode源代码
2.9 成为符合ANSI和Unicode的应用程序
第3章 内核对象
3.1 什么是内核对象
3.2 进程的内核对象句柄表
3.3 跨越进程边界共享内核对象
第二部分 编程的具体方法
第4章 进程
4.1 编写第一个Windows应用程序
4.2 CreateProcess函数
4.3 终止进程的运行
4.4 子进程
4.5 枚举系统中运行的进程
第5章 作业
5.1 对作业进程的限制
5.2 将进程放入作业
5.3 终止作业中所有进程的运行
5.4 查询作业统计信息
5.5 作业通知信息
5.6 JobLab示例应用程序
第6章 线程的基础知识
6.1 何时创建线程
6.2 何时不能创建线程
6.3 编写第一个线程函数
6.4 CreateThread函数
6.5 终止线程的运行
6.6 线程的一些性质
6.7 C/C++运行期库的考虑
6.8 对自己的ID概念应该有所了解
第7章 线程的调度、优先级和亲缘性
7.1 暂停和恢复线程的运行
7.2 暂停和恢复进程的运行
7.3 睡眠方式
7.4 转换到另一个线程
7.5 线程的运行时间
7.6 运用结构环境
7.7 线程的优先级
7.8 对优先级的抽象说明
7.9 程序的优先级
7.10 亲缘性
第8章 用户方式中线程的同步
8.1 原子访问:互锁的函数家族
8.2 高速缓存行
8.3 高级线程同步
8.4 关键代码段
第9章 线程与内核对象的同步
9.1 等待函数
9.2 成功等待的副作用
9.3 事件内核对象
9.4 等待定时器内核对象
9.5 信标内核对象
9.6 互斥对象内核对象
9.7 线程同步对象速查表
9.8 其他的线程同步函数
第10章 线程同步工具包
10.1 实现关键代码段:Optex
10.2 创建线程安全的数据类型和反信标
10.3 单个写入程序/多个阅读程序的保护
10.4 实现一个WaitForMultipleExpressions函数
第11章 线程池的使用
11.1 方案1:异步调用函数
11.2 方案2:按规定的时间间隔调用函数
11.3 方案3:当单个内核对象变为已通知状态时调用函数
11.4 方案4:当异步I / O请求完成运行时调用函数
第12章 纤程
12.1 纤程的操作
12.2 Counter示例应用程序
第三部分 内存管理
第13章 Windows的内存结构
13.1 进程的虚拟地址空间
13.2 虚拟地址空间如何分区
13.3 地址空间中的区域
13.4 提交地址空间区域中的物理存储器
13.5 物理存储器与页文件
13.6 保护属性
13.7 综合使用所有的元素
13.8 数据对齐的重要性
第14章 虚拟内存
14.1 系统信息
14.2 虚拟内存的状态
14.3 确定地址空间的状态
第15章 在应用程序中使用虚拟内存
15.1 在地址空间中保留一个区域
15.2 在保留区域中的提交存储器
15.3 同时进行区域的保留和内存的提交
15.4 何时提交物理存储器
15.5 回收虚拟内存和释放地址空间区域
15.6 改变保护属性
15.7 清除物理存储器的内容
15.8 地址窗口扩展———适用于Windows 2000
第16章 线程的堆栈
16.1 Windows 98下的线程堆栈
16.2 C/C++运行期库的堆栈检查函数
16.3 Summation示例应用程序
第17章 内存映射文件
17.1 内存映射的可执行文件和DLL文件
17.2 内存映射数据文件
17.3 使用内存映射文件
17.4 使用内存映射文件来处理大文件
17.5 内存映射文件与数据视图的相关性
17.6 设定内存映射文件的基地址
17.7 实现内存映射文件的具体方法
17.8 使用内存映射文件在进程之间共享数据
17.9 页文件支持的内存映射文件
17.10 稀疏提交的内存映射文件
第18章 堆栈
18.1 进程的默认堆栈
18.2 为什么要创建辅助堆栈
18.3 如何创建辅助堆栈
18.4 其他堆栈函数
第四部分 动态链接库
第19章 DLL基础
19.1 DLL与进程的地址空间
19.2 DLL的总体运行情况
19.3 创建DLL模块
19.4 创建可执行模块
19.5 运行可执行模块
第20章 DLL的高级操作技术
20.1 DLL模块的显式加载和符号链接
20.2 DLL的进入点函数
20.3 延迟加载DLL
20.4 函数转发器
20.5 已知的DLL
20.6 DLL转移
20.7 改变模块的位置
20.8 绑定模块
第21章 线程本地存储器
21.1 动态TLS
21.2 静态TLS
第22章 插入DLL和挂接API
22.1 插入DLL:一个例子
22.2 使用注册表来插入DLL
22.3 使用Windows挂钩来插入DLL
22.4 使用远程线程来插入DLL
22.5 使用特洛伊DLL来插入DLL
22.6 将DLL作为调试程序来插入
22.7 用Windows 98上的内存映射文件插入代码
22.8 用CreateProcess插入代码
22.9 挂接API的一个示例
第五部分 结构化异常处理
第23章 结束处理程序
23.1 通过例子理解结束处理程序
23.2 Funcenstein1
23.3 Funcenstein2
23.4 Funcenstein3
23.5 Funcfurter1
23.6 突击测验:FuncaDoodleDoo
23.7 Funcenstein4
23.8 Funcarama1
23.9 Funcarama2
23.10 Funcarama3
23.11 Funcarama4:最终的边界
23.12 关于finally块的说明
23.13 Funcfurter2
23.14 SEH结束处理示例程序
第24章 异常处理程序和软件异常
24.1 通过例子理解异常过滤器和异常处理程序
24.2 EXCEPTION_EXECUTE_HANDLER
24.3 EXCEPTION_CONTINUE_EXECUTION
24.4 EXCEPTION_CONTINUE_SEARCH
24.5 GetExceptionCode
24.6 GetExceptionInformation
24.7 软件异常
第25章 未处理异常和C++异常
25.1 即时调试
25.2 关闭异常消息框
25.3 程序员自己调用UnhandledExceptionFilter
25.4 UnhandledExceptionFilter函数的一些细节
25.5 异常与调试程序
25.6 C++异常与结构性异常的对比
第六部分 窗口
第26章 窗口消息
26.1 线程的消息队列
26.2 将消息发送到线程的消息队列中
26.3 向窗口发送消息
26.4 唤醒一个线程
26.5 通过消息发送数据
26.6 Windows如何处理ANSI/Unicode字符和字符串
第27章 硬件输入模型和局部输入状态
27.1 原始输入线程
27.2 局部输入状态
27.3 将虚拟输入队列同局部输入状态挂接在一起
第七部分 附录
附录A 建立环境
A.1 CmmHdr. h头文件
附录B 消息分流器、子控件宏和API宏
B.1 消息分流器
B.2 子控件宏
B.3 API宏