• 第一部分 程序员必读
    • 第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宏