MFC和ATL之间的根本区别是什么?

时间:2011-08-27 01:49:02

标签: c++ visual-c++ mfc atl

假设我将它们用于“普通”GUI程序(没有COM,没有ActiveX,没什么特别的),我将在ATL和MFC之间看到的根本区别是什么,帮我找出使用哪一个?


我在网上做了一些搜索,但最终没有一个答案真的回答了我的问题:

  • http://msdn.microsoft.com/en-us/library/bk8ytxz5(v=vs.80).aspx

    • “ATL是一种快速,简便的方法,可以在C ++中创建COM组件并保持较小的占用空间。如果您不需要所有内置功能,请使用ATL创建控件MFC自动提供。“

      没有真正回答我的问题,因为:

      • 我不与COM合作。

      • 这是否意味着MFC 不是快?为什么/怎么样?

    • “MFC允许您创建完整的应用程序,ActiveX控件和活动文档。如果您已经使用MFC创建了控件,则可能需要在MFC中继续开发。在创建新控件时,如果您不需要MFC的所有内置功能,请考虑使用ATL。“

      也不回答我的问题,因为:

      • 我甚至不知道ActiveX 的原因。

      • 看起来微软似乎不鼓励使用MFC,但我无法弄清楚原因。

      • 究竟是什么?MFC的“内置功能”是ATL不提供的?

    • 一般情况下,这不能回答我的问题,因为没有解释缺点及其背后的原因。

因为直接或间接地,所有内容似乎都链接回上一页:

我目前观察到的 (在过去几天内,在尝试学习两者时):

  • ATL基于模板或编译时多态。
    • ATL方法往往是非虚拟的,往往会返回引用。
  • MFC基于虚方法或运行时多态。
    • MFC方法往往是虚拟的,往往会返回指针。

似乎没有任何架构差异

  • 两者都使用消息地图(BEGIN_MSG_MAPBEGIN_MESSAGE_MAP ...大不了)
  • 将Win32方法都包装到类
  • 两者似乎都有类似的CWndCWindow
  • 类别

但是,如果除了编译时与运行时方面之外没有真正的区别,那么为什么它们都存在呢?难道其中一个不够吗?

我在这里缺少什么?

3 个答案:

答案 0 :(得分:156)

答案 1 :(得分:18)

很多人都告诉我,他们的编程经验对ATL的痛苦比对MFC的痛苦少。使用ATL,您编译的可执行文件也会小得多。

我建议您take a look at WTL,因为它建立在ATL之上。

  

他们一直提到的“额外功能”是什么?我需要吗?

如果您定义了要求,如果可以避免使用MFC,则可能更容易回答。不幸的是,“没什么特别的”不够独占。包含您打算使用哪些功能可能更有用(哪些控件,您想要使用哪些框架/技术/现有库等)。

但这里是an article that describes some features in MFC that aren't directly supported by WTL/ATL.

  

MFC也已经发展到它支持许多理想的功能,例如MAPI,支持其他Windows徽标要求,套接字,文档(如果您喜欢和/或使用该模式)以及复合文档文件。 WTL有很酷的功能,但MFC是明显的功能冠军。这两种环境都支持框架主窗口架构(具有单独视图窗口的框架窗口),SDI和MDI应用程序,拆分窗口,基于对话框的应用程序以及用于COM支持的各种基于COM的类。

答案 2 :(得分:9)

ATL是一组用于简化COM对象实现的类。

您可以在没有MFC的情况下使用它。在我的工作中,我们使用ATL将COM接口暴露给计算代码。没有涉及GUI,我们能够从例如调用此计算代码。 Excel VBA。

查看一些COM指南/教程,了解它的摘要。

MFC只是Win32 API的一组GUI包装类。查看一些Win32 API教程,了解它的摘要。