**ATL 基础应用篇导读:从内存管理到集合遍历的 COM 进阶之路**
在 Windows 原生开发的深水区,COM(组件对象模型)不仅是技术基石,更是衡量工程师底层功底的重要标尺。然而,直接使用 COM API 往往伴随着繁琐的代码量和容易出错的资源管理。ATL(Active Template Library)作为微软提供的轻量级 COM 开发框架,以其模板化的优雅和极致性能,成为许多高性能组件开发的首选。本课程《ATL(四)基础应用篇》正是为了帮助开发者跨越“会用 COM”到“精通 ATL”的鸿沟,深入剖析两个核心领域:永久存储机制与列举器实现。
首先,课程将带你深入理解 COM 对象的持久化问题——永久存储。在实际工程中,如何将一个内存中的对象状态保存为文件,或在程序重启时恢复,是常见且棘手的需求。本模块从 1-1 至 1-5,并未直接堆砌代码,而是采取了“由浅入深、原理先行”的教学策略。讲师首先通过 1-2 章节引导学员尝试自行实现一个简单的永久存储方案,这一过程能让你切身感受到 COM 接口设计背后的复杂性,从而为后续理解标准解法打下坚实基础。随后,课程详细拆解了 ATL 实现永久存储的原理(1-3、1-4),揭示了 `IPersistStream` 等接口在底层是如何与二进制流交互的。特别值得一提的是 1-5 章节关于 `Marshal As Value` 的讲解,这是处理复杂数据类型序列化时的关键技巧,它解决了跨进程或跨模块传输对象时的内存拷贝与 marshaling 难题,是进阶开发的必备知识。
其次,课程的重点转向了集合操作中的列举器(Enumerator)。在 COM 中,遍历集合通常通过 `IEnumXXX` 接口实现,这不仅要求实现类遵循特定协议,还涉及引用计数和线程安全等细节。2-1 章节通过具体示例展示了 ATL 如何实现标准的列举器,建立了直观认知。紧接着,2-2 章节引入了 ATL 的核心利器——`CComEnum` 模板类。这是一个极具智慧的设计,它将繁琐的接口实现封装在模板内部,让开发者只需关注容器类型和元素类型。课程进一步拓展了 `CComEnum` 的两种变体用法(2-3),并针对现代 C++ 中最常用的 `std::vector`,讲解了如何实现非拷贝形式的高性能列举(2-4),这在处理大数据量场景下尤为重要。
最后,2-5 和 2-6 章节探讨了更高级的应用场景:自带类型转换的列举以及“即用即创建”的容器接口设计。这不仅是技术的堆叠,更是设计思维的升华,帮助开发者在保持 COM 兼容性的同时,享受 C++ 模板元编程带来的便利。
总之,本课程并非简单的 API 罗列,而是一次对 ATL 核心机制的系统性梳理。对于希望提升 Windows 底层开发能力、优化 COM 组件性能的工程师而言,这是一份不可多得的实战指南。通过本篇学习,你将不再畏惧复杂的持久化逻辑,也能轻松驾驭各类集合的遍历需求,真正掌握 ATL 的基础精髓。
课程目录
1-1 [永久存储] 永久存储简介 (55:16) 1-2 [永久存储] 自己实现一个永久存储 (36:27) 1-3 [永久存储] ATL实现永久存储的原理一 (01:12:30) 1-4 [永久存储] ATL实现永久存储原理二 (55:28) 1-5 [永久存储] Marshal As Value (47:55) 2-1 [ATL列举器] ATL实现IEnumXXX举例 (34:41) 2-2 [ATL列举器] CComEnum (45:38) 2-3 [ATL列举器] CComEnum另外两种列举方法举例 (13:19) 2-4 [ATL列举器] 列举顺序容器vector的非拷贝形式 (26:04) 2-5 [ATL列举器] 自带拷贝和类型转换的列举 (17:28) 2-6 [ATL列举器] 即用即创建的顺序容器 (22:33) 2-7 [ATL列举器] 容器接口 (19:54) 2-8 [ATL列举器] 垫片类CAdaptor (19:33) 2-9 [ATL列举器] Atl提供的几个容器类 (42:44) 3-1 [连接点] 连接点 (59:45) 3-2 [连接点] 连接点的实现例子 (47:00) 3-3 [连接点] 在DLL中制作接受连接点事件的对象 (49:16) 3-4 [连接点] 接受连接点事件对象内部实现原理 (59:52) 3-5 [连接点] 使用实例 (29:42) 3-6 [连接点] IProviderClassInfo2 (18:25) 4-1 [窗口和对话框] ATL中的windows窗口程序 (38:43) 4-2 [窗口和对话框] SupClass (17:45) 4-3 [窗口和对话框] 把一个窗口的所有东西做到一个类中(一) (51:08) 4-4 [窗口和对话框] 把一个窗口放到一个类中(二) (01:09:20) 4-5 [窗口和对话框] SupClass和ATL (27:59) 4-6 [窗口和对话框] ATL中窗口类的注册 (52:20) 4-7 [窗口和对话框] 设置窗口类类型以及窗口类型和扩展类型 (53:41) 4-8 [窗口和对话框] 窗口消息处理过程 (54:39) 4-9 [窗口和对话框] ATL窗口消息处理宏用法 (12:13) 4-10 [窗口和对话框] ATL窗口消息处理宏结构 (11:18) 4-11 [窗口和对话框] Command和Notify消息 (23:55) 4-12 [窗口和对话框] 消息反弹技术 (01:06:30) 4-13 [窗口和对话框] 消息上推技术 (36:20) 4-14 [窗口和对话框] 消息链条和消息分类 (36:45) 4-15 [窗口和对话框] 动态消息链 (29:51) 4-16 [窗口和对话框] 对话框程序 (38:36) 4-17 [窗口和对话框] CContainedWindow中的SuperClass技术 (53:24) 4-18 [窗口和对话框] SubClass技术 (34:52) 5-1 [属性页] 属性页的原理 (01:08:56) 6-1 [控件] 属性页的原理 (01:08:56) 6-2 [控件] 控件概述 (34:10) 6-3 [控件] 容器侧规则一 (55:02) 6-4 [控件] 容器侧规则二 (24:18) 6-5 [控件] 控件规则一 (53:54) 6-6 [控件] 控件规则二 (01:00:57) 6-7 [控件] 阅读代码环境的搭建 (30:09) 6-8 [控件] IOleObject在ATL中的实现一 (01:01:14) 6-9 [控件] IOleObject在ATL中的实现二 (45:02) 6-10 [控件] 控件是如何被激活的 (55:22) 6-11 [控件] 控件的显示-有窗口(WM_PAINT) (32:46) 6-12 [控件] IViewObject和无窗口控件的视图 (01:07:25) 6-13 [控件] 控件侧的其他接口的实现 (01:27:28) 6-14 [控件] 控件中的IPropertyNotifySink接口以及控件默 (01:03:56) 6-15 [控件] 容器侧如何激活控件一 (01:01:17) 6-16 [控件] 容器侧如何激活控件二 (41:41) 6-17 [控件] 容器侧Control Site的实现一 (43:31) 6-18 [控件] 容器侧ControlSite接口实现二 (40:29) 6-19 [控件] 容器侧的ControlSite接口实现三 (48:44) 6-20 [控件] ATL对话框上的控件 (35:08) 6-21 [控件] 如何用带控件的对话框模板来创建对话框 (48:58) 6-22 [控件] 复合控件和DHTML控件 (51:44)





