【发布时间】:2011-11-04 22:31:08
【问题描述】:
假设我仅将它们用于“普通”GUI 程序(没有 COM,没有 ActiveX,没有什么花哨的),我将看到 ATL 和 MFC 之间的根本区别是什么?帮我弄清楚该用哪一个?
我在网上做了一些搜索,但最终没有一个答案真正回答了我的问题:
-
http://msdn.microsoft.com/en-us/library/bk8ytxz5(v=vs.80).aspx:
-
“ATL 是一种快速、简单的方法,既可以在 C++ 中创建 COM 组件,又可以保持较小的占用空间。如果您不需要 MFC 自动提供的所有内置功能,请使用 ATL 创建控件提供。”
并没有真正回答我的问题,因为:
我没有使用 COM。
这是否意味着 MFC 不快?为什么/如何?
-
“MFC 允许您创建完整的应用程序、ActiveX 控件和活动文档。如果您已经使用 MFC 创建了控件,您可能希望在 MFC 中继续开发。创建新控件时,请考虑使用 ATL如果您不需要 MFC 的所有内置功能。”
也没有回答我的问题,因为:
一开始我什至不知道 ActiveX 是什么。
看起来微软不鼓励使用 MFC,但我不知道为什么。
究竟是 ATL 不提供的 MFC 的“内置功能”是什么?
总的来说,这并不能回答我的问题,因为它没有解释缺点及其背后的原因。
-
因为直接或间接地,一切似乎都链接回了上一页:
-
How do I decide whether to use ATL, MFC, Win32 or CLR for a new C++ project?
-
“在 ATL 和 MFC 之间做出选择有点棘手。 [[别开玩笑!]] 我建议您向 MSDN's page 进行选择,以便在它们之间做出选择。”
显然,这并没有回答我的问题。 :)
-
http://www.codeguru.com/forum/archive/index.php/t-64778.html
等
我目前观察到的(在过去几天内,同时尝试学习两者):
- ATL 基于模板或编译时多态性。
- ATL 方法往往是非虚拟的,并且往往会返回引用。
- MFC 基于虚拟方法或运行时多态性。
- MFC 方法往往是虚拟的,并且往往返回指针。
但是它们之间似乎没有任何架构差异:
- 两者都使用消息映射(
BEGIN_MSG_MAP与BEGIN_MESSAGE_MAP... 很重要) - 两者都将 Win32 方法包装到类中
-
CWnd与CWindow似乎都有相似的类
但是,如果除了编译时和运行时方面没有真正的区别,那么为什么它们都存在呢?一个还不够吗?
我在这里错过了什么?
【问题讨论】:
-
我可能是错的,但我知道 MFC 需要一个相当庞大的运行时 DLL,而我认为 ATL 将所有内容构建到一个 exe 中。 ATL 通常重量较轻。另外,check out WTL
-
@Merlyn:是的,但是为什么它需要一个庞大的运行时 DLL?造成这种情况的根本区别是什么?
-
继承从 DLL 链接的预编译类与继承通过源代码包含/模板实例化链接的模板之间的区别相同。模板通常是“仅标头”库。我的回答是不完整的,因此在 cmets 中 :) 由于大量采用和向后兼容性,MFC 仍然存在。否则,MS 在创建更新的 win32 包装器时会将其丢弃。他们的软件往往有很长的支持合同(各不相同,但最长 10 年)。支持与弃用并不矛盾。
-
@Merlyn:所以我的理解是我不应该使用 MFC?他们一直提到的“额外功能”是什么?我需要它吗?
-
@Merlyn:听说过 ATL.DLL?听说过“使用 MFC 作为静态库”这个术语吗?
标签: c++ visual-c++ mfc atl