《深入浅出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/component
struct 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个目录坐标全部进入机制链,不用泛化主题替代原书章节。

术语表

讨论

评论区加载中…