ATL 这个词在很多人的技术栈里是空白的:听说过 COM,写过几天 MFC,模板和泛型的概念也懂一点,但真要问"ATL 到底解决什么问题、什么时候该用它、什么时候不该用它",往往答不上来。这门《ATL(四)基础应用篇》针对的就是这个缺口,不是带你重新学一遍 C++,而是补上 Windows 平台开发里那块被跳过的基础拼图。

先说清楚:这个缺口通常长什么样

常见的三种情况。第一种,维护老项目时翻到几行 IDispatch、CComPtr、BEGIN_COM_MAP,能猜出大概意思,但不敢改,怕改完编译能过、跑起来崩。第二种,面试被问到"COM 的引用计数为什么容易漏",只能背一句"AddRef 和 Release 要配对",说不出具体在哪种继承关系下会漏、漏了以后表现是什么。第三种,看别人写的轻量组件代码干干净净,自己一动手就是一堆宏和类型转换糊在一起。

这三种情况本质是同一个问题:把 ATL 当成一堆宏背下来,而没有把它当成"用 C++ 把 COM 那套繁琐规则封装起来"的一套设计。这篇导读就是想帮你把学习重心从"记住宏的名字"转到"理解它在替你做什么"。

基础应用篇要解决什么

基础应用,重点在"用"而不是"造"。它不要求你先啃完一整本 COM 原理,而是从能跑起来的最小单元开始:一个接口怎么定义、一个类怎么实现、客户代码怎么拿到接口指针、生命周期由谁负责。把这些走通之后,再回头看那些宏,你会发现它们只是在替你补样板代码。

  • 接口与实现的关系:IDL 里的声明和 C++ 类里的实现怎么对应上,为什么会有一层看似多余的映射。
  • 引用计数的实际表现:什么时候计数会加、什么时候会减、循环引用在真实代码里长什么样子。
  • 智能指针的使用边界:它替你做了多少事,哪些场景仍然需要你手动判断。
  • 把组件接进调用方:从注册到获取接口,中间每一步失败时分别会看到什么现象。

如果不确定自己该不该看这门课,可以先用一个问题自测:给你一段使用了 ATL 智能指针的代码,你能指出其中哪一行最可能导致对象释放不掉吗?答不上来,说明基础应用这一层确实还没打通。

建议怎么用这份材料

不要一口气看完。每看完一节,回到自己手边的老代码里找一处对应的写法,对照着读一遍。看到 BEGIN_COM_MAP 就去看这个类实际暴露了哪几个接口,看到 CComPtr 就去数一下这个对象在函数返回时有没有被正确释放。这种"看一节、对一处"的节奏,比连看十节然后全部忘记要有效得多。

另外建议每两到三节写一份自己的小结,不要抄目录,只写两件事:这一节解决的是什么具体麻烦,我在哪段真实代码里见过它。写不出来,说明还没真正理解。

看完应该能回答的问题

  • 一个 COM 组件从被创建到被销毁,引用计数分别在哪些时刻发生变化?
  • 为什么有些接口查询会失败,失败通常出在定义、实现还是调用方?
  • ATL 的智能指针在什么情况下帮不上忙,需要你自己判断?
  • 如果要给现有的一段 C++ 代码加一个可被外部调用的接口,最小改动是什么?
  • 看到一段含大量宏的组件代码,你能不能在五分钟内说出它的接口清单和生命周期归属?

这五个问题能答上来三个以上,基础应用这一层就算过了。答不上来的部分,正好是需要回头再补的地方——缺什么补什么,别假装什么都会,这在 ATL 这种细节密集的方向上尤其重要。


c4597b774b966a9011f8b2b10f9e39e6_format,webp.webp 下载附件   保存到相册 2025-2-11 22:42 上传

课程推荐

《ATL(四)基础应用篇(价值300元)》c4597b774b966a9011f8b2b10f9e39e6_format,webp.webp 下载附件   保存到相册 2025-2-11 22:42 上传【技能收获】学完可掌握:核心实战技能、项目驱动学习。课程以实战为导向,覆盖从基础概念到完整项目落地的关键步骤,配套章节笔记便于课后复盘与面试前快速回顾。【学习建议】建议按目录顺序学习,先打基础再进入综合实战章节;每完成 2~3 节可结合笔记整理一份学习小结,最终尝试独立复现一套完整 Demo 写入个人作品集。【就业发展】可面向岗位:Linux 运维工程师、SRE、云计算工程师、DevOps 工程师。云原生与自动化运维仍是企业 IT 刚需方向,认证 + 实战项目组合能显著提升面试通过率,适合向中高级运维或架构岗进阶。 若你已有一定编程或运维基础,本课程可帮助你在现有技能栈上快速叠加热门方向能力,提升求职时的项目说服力与薪资谈判空间。

视频目录(60 节)

*   1 永久存储简介.mp4

*   2 自己实现一个永久存储.mp4

*   3 ATL实现永久存储的原理一.mp4

*   4 ATL实现永久存储原理二.mp4

*   5 MarshalAsValue.mp4

*   6 ATL实现IEnumXXX举例.mp4

*   7 CComEnum.mp4

*   8 CComEnum另外两种列举方法举例.mp4

*   9 列举顺序容器vector的非拷贝形式.mp4

*   10 自带拷贝和类型转换的列举.mp4

*   11 即用即创建的顺序容器.mp4

*   12 容器接口.mp4

*   13 垫片类CAdaptor.mp4

*   14 Atl提供的几个容器类.mp4

*   15 连接点.mp4

*   16 连接点的实现例子.mp4

*   17 在DLL中制作接受连接点事件的对象.mp4

*   18 接受连接点事件对象内部实现原理.mp4

*   19 使用实例.mp4

*   20 IProviderClassInfo2.mp4

*   21 ATL中的windows窗口程序.mp4

*   22 SupClass.mp4

*   23 把一个窗口的所有东西做到一个类中(一).mp4

*   24 把一个窗口放到一个类中(二).mp4

*   25 SupClass和ATL.mp4

*   26 ATL中窗口类的注册.mp4

*   27 设置窗口类类型以及窗口类型和扩展类型.mp4

*   28 窗口消息处理过程.mp4

*   29 ATL窗口消息处理宏用法.mp4

*   30 ATL窗口消息处理宏结构.mp4

*   31 Command和Notify消息.mp4

*   32 消息反弹技术.mp4

*   33 消息上推技术.mp4

*   34 消息链条和消息分类.mp4

*   35 动态消息链.mp4

*   36 对话框程序.mp4

*   37 CContainedWindow中的SuperClass技术.mp4

*   38 SubClass技术.mp4

*   39 属性页的原理.mp4

*   40 控件概述.mp4

*   41 容器侧规则一.mp4

*   42 容器侧规则二.mp4

*   43 控件规则一.mp4

*   44 控件规则二.mp4

*   45 阅读代码环境的搭建.mp4

*   46 IOleObject在ATL中的实现一.mp4

*   47 IOleObject在ATL中的实现二.mp4

*   48 控件是如何被激活的.mp4

*   49 控件的显示-有窗口(WM_PAINT).mp4

*   50 IViewObject和无窗口控件的视图.mp4

*   51 控件侧的其他接口的实现.mp4

*   52 控件中的IPropertyNotifySink接口以及控件默.mp4

*   53 容器侧如何激活控件一.mp4

*   54 容器侧如何激活控件二.mp4

*   55 容器侧ControlSite的实现一.mp4

*   56 容器侧ControlSite接口实现二.mp4

*   57 容器侧的ControlSite接口实现三.mp4

*   58 ATL对话框上的控件.mp4

*   59 如何用带控件的对话框模板来创建对话框.mp4

*   60 复合控件和DHTML控件.mp4