《深入浅出MFC(第二版)》全书总复习
以可运行Scribble与DBWIN实验串联Win32、C++对象模型、MFC生命线、六大关键技术、文档视图、UI、打印、线程和组件。 覆盖6个本页目录坐标。
直觉起点
、、、、共同构成本页坐标。以可运行Scribble与DBWIN实验串联Win32、C++对象模型、MFC生命线、六大关键技术、文档视图、UI、打印、线程和组件。
阅读MFC代码要同时保留三层视图:最上层是AppWizard生成类和宏,中间层是MFC类层次、运行时表与回调,底层是Win32窗口、消息、句柄、线程和文件。只会点击向导或背宏,无法解释对象为何诞生、消息为何到达、文件为何能重建动态类型。
六阶段机制链
1. 重建Win32基线
以可运行Scribble与DBWIN实验串联Win32、C++对象模型、MFC生命线、六大关键技术、文档视图、UI、打印、线程和组件。 本阶段围绕“对象与生命期”建立预测:列出参与类、入口函数、宏展开、资源ID、线程或文件状态,再运行最小样例。进入“验证框架生命线”前必须保存首个分叉证据,不能让后续框架回调覆盖真正原因。
2. 验证框架生命线
以可运行Scribble与DBWIN实验串联Win32、C++对象模型、MFC生命线、六大关键技术、文档视图、UI、打印、线程和组件。 本阶段围绕“运行时类与动态创建”建立预测:列出参与类、入口函数、宏展开、资源ID、线程或文件状态,再运行最小样例。进入“运行Scribble主线”前必须保存首个分叉证据,不能让后续框架回调覆盖真正原因。
3. 运行Scribble主线
以可运行Scribble与DBWIN实验串联Win32、C++对象模型、MFC生命线、六大关键技术、文档视图、UI、打印、线程和组件。 本阶段围绕“序列化”建立预测:列出参与类、入口函数、宏展开、资源ID、线程或文件状态,再运行最小样例。进入“注入消息持久化故障”前必须保存首个分叉证据,不能让后续框架回调覆盖真正原因。
4. 注入消息持久化故障
以可运行Scribble与DBWIN实验串联Win32、C++对象模型、MFC生命线、六大关键技术、文档视图、UI、打印、线程和组件。 本阶段围绕“消息映射与命令路由”建立预测:列出参与类、入口函数、宏展开、资源ID、线程或文件状态,再运行最小样例。进入“加入线程与组件”前必须保存首个分叉证据,不能让后续框架回调覆盖真正原因。
5. 加入线程与组件
以可运行Scribble与DBWIN实验串联Win32、C++对象模型、MFC生命线、六大关键技术、文档视图、UI、打印、线程和组件。 本阶段围绕“Document/View与打印”建立预测:列出参与类、入口函数、宏展开、资源ID、线程或文件状态,再运行最小样例。进入“审计附录项目”前必须保存首个分叉证据,不能让后续框架回调覆盖真正原因。
6. 审计附录项目
以可运行Scribble与DBWIN实验串联Win32、C++对象模型、MFC生命线、六大关键技术、文档视图、UI、打印、线程和组件。 本阶段围绕“线程、组件与DBWIN”建立预测:列出参与类、入口函数、宏展开、资源ID、线程或文件状态,再运行最小样例。进入“重建Win32基线”前必须保存首个分叉证据,不能让后续框架回调覆盖真正原因。
核心机制深挖
以可运行Scribble与DBWIN实验串联Win32、C++对象模型、MFC生命线、六大关键技术、文档视图、UI、打印、线程和组件。 原书绑定Visual C++ 5.0与MFC 4.2。本页保留这个历史技术身份;现代Visual Studio、64位、Unicode、智能指针或新UI框架只可作为明确标注的对照,不能反向改写原书机制。
本页不变量是:版本、对象图、消息轨迹、持久化字节、UI状态和线程清理都可追溯;313个目录层级均能落到实验或解释证据。。它必须在正常输入、空输入、创建失败、消息未处理、持久化版本不符和中断恢复中都成立。窗口看起来能显示、命令偶尔能执行或文件能写出,都不足以证明对象图、分派路径和资源生存期正确。
最小实验:从干净环境编译综合样例,按固定输入执行创建、编辑、保存、重开、多View、打印、后台计算和调试捕获。 运行前记录工具版本、编译选项、链接方式、资源哈希、输入序列和预期调用路径;运行后保存消息日志、对象关系、文件字节或线程退出状态。
故障实验:构造类型登记、Archive版本、命令目标、打印坐标、线程退出与ActiveX注册六类故障,要求停在首个因果分叉。 每次只改变一个条件,停在第一处与预测不同的位置。删除故障后从干净构建或明确逆操作恢复,并以完全相同的输入重放;如果最终画面相同但对象、句柄、线程、Archive或资源状态不同,仍判定失败。
机制证据表至少保留六列:框架表面动作、对应的C++对象或宏、下沉到Win32的入口、可观察状态、首个失败信号、恢复操作。对历史代码还要单列“原书行为”和“现代迁移差异”:前者用于解释MFC 4.2为何这样工作,后者只说明在64位、Unicode或新工具链中怎样验证同一不变量。这样既不会把旧API当成今天的最佳实践,也不会因现代封装更方便而跳过原书真正要揭示的内部机制。
最小可重放骨架
Win32 event loop -> MFC lifecycle -> runtime class -> Document/View -> message route -> archive -> print/thread/componentstruct Gate { bool identity; bool objectGraph; bool route; bool persistence; bool recovery; };
bool pass(const Gate& g) { return g.identity && g.objectGraph && g.route && g.persistence && g.recovery; }baseline -> one fault -> first divergence -> explicit recovery -> identical-input replay -> state comparison正式目录逐项讲解
对象与生命期
“对象与生命期”在本页用于定位类层次中的责任、所有权和协作关系。先在“重建Win32基线”阶段标出Win32底座涉及的对象、线程、资源或表项,写下预期入口、状态变化和退出条件;再推进到“验证框架生命线”,用调用栈、消息日志、对象图、序列化字节或界面状态验证推断。这里不能只记住向导操作或宏名字:必须说明它替代了哪段Win32/C++机制、失败首先在哪里可见,以及怎样恢复后用同一输入重放。
运行时类与动态创建
“运行时类与动态创建”在本页用于定位类层次中的责任、所有权和协作关系。先在“验证框架生命线”阶段标出六大关键技术涉及的对象、线程、资源或表项,写下预期入口、状态变化和退出条件;再推进到“运行Scribble主线”,用调用栈、消息日志、对象图、序列化字节或界面状态验证推断。这里不能只记住向导操作或宏名字:必须说明它替代了哪段Win32/C++机制、失败首先在哪里可见,以及怎样恢复后用同一输入重放。
序列化
“序列化”在本页用于连接本章术语、输入输出、状态变化和可验证结果。先在“运行Scribble主线”阶段标出Document/View涉及的对象、线程、资源或表项,写下预期入口、状态变化和退出条件;再推进到“注入消息持久化故障”,用调用栈、消息日志、对象图、序列化字节或界面状态验证推断。这里不能只记住向导操作或宏名字:必须说明它替代了哪段Win32/C++机制、失败首先在哪里可见,以及怎样恢复后用同一输入重放。
消息映射与命令路由
“消息映射与命令路由”在本页用于追踪事件从入口到处理器再到退出的分派路径。先在“注入消息持久化故障”阶段标出命令路由涉及的对象、线程、资源或表项,写下预期入口、状态变化和退出条件;再推进到“加入线程与组件”,用调用栈、消息日志、对象图、序列化字节或界面状态验证推断。这里不能只记住向导操作或宏名字:必须说明它替代了哪段Win32/C++机制、失败首先在哪里可见,以及怎样恢复后用同一输入重放。
Document/View与打印
“Document/View与打印”在本页用于定位类层次中的责任、所有权和协作关系。先在“加入线程与组件”阶段标出综合回归涉及的对象、线程、资源或表项,写下预期入口、状态变化和退出条件;再推进到“审计附录项目”,用调用栈、消息日志、对象图、序列化字节或界面状态验证推断。这里不能只记住向导操作或宏名字:必须说明它替代了哪段Win32/C++机制、失败首先在哪里可见,以及怎样恢复后用同一输入重放。
线程、组件与DBWIN
“线程、组件与DBWIN”在本页用于把抽象机制落到可运行对象图和调用轨迹。先在“审计附录项目”阶段标出Win32底座涉及的对象、线程、资源或表项,写下预期入口、状态变化和退出条件;再推进到“重建Win32基线”,用调用栈、消息日志、对象图、序列化字节或界面状态验证推断。这里不能只记住向导操作或宏名字:必须说明它替代了哪段Win32/C++机制、失败首先在哪里可见,以及怎样恢复后用同一输入重放。
分步视觉验证
常见误区与故障注入
四类样本与验收
| 样本 | 注入方式 | 必查证据 | 通过条件 |
|---|---|---|---|
| 基线 | 固定工程、资源与输入 | 对象图、调用栈、消息序列 | 与预测一致 |
| 边界 | 空文档、无处理器、极限尺寸 | 默认路径、返回值、资源状态 | 不越界不泄漏 |
| 失败 | 缺宏、创建失败、版本不符 | 首个分叉及责任层 | 失败被隔离 |
| 恢复 | 干净重建后同输入重放 | 文件、窗口、线程与句柄 | 回到基线 |
练习
小结
- Win32底座:连接“重建Win32基线”的对象、控制流与证据。
- 六大关键技术:连接“验证框架生命线”的对象、控制流与证据。
- Document/View:连接“运行Scribble主线”的对象、控制流与证据。
- 命令路由:连接“注入消息持久化故障”的对象、控制流与证据。
- 综合回归:连接“加入线程与组件”的对象、控制流与证据。
- 本页6个目录坐标全部进入机制链,不用泛化主题替代原书章节。