如果您回顾一下这两个库是如何随着时间而产生和演变的,我认为您的问题的答案大部分是历史性的。
简短的答案是,如果您没有做任何“花哨的事情”,请使用ATL。非常适合带有COM的简单用户界面。
长话大说:MFC始建于90年代初,尝试使用这种称为C ++的新语言并将其应用于Windows。当OS尚不具备Office类功能时,它便可供开发社区使用。
[编辑点缀:我没有在Microsoft工作,所以我不知道Office是否曾经建立在MFC上,但是我认为答案是否定的。回到Win 3.1,即Win 95,Office UI团队将发明新的控件,并将其打包在库中,然后Windows和MFC团队将包装和API合并到具有可再发行dll的那些控件中。我猜想这些团队之间会有一些协作和代码共享。最终,这些控件会将其放入Service Pack或下一Windows版本的基本操作系统中。Office Ribbon在Office出厂后作为附加组件添加到Office Ribbon中继续了这种模式,现在它已成为Windows OS的一部分。]
当时,该库非常原始,这是因为C ++语言和编译器是新的,并且随着Office的发展,Microsoft随着时间的推移逐步建立了该库。
由于这个历史,MFC:
- 具有相当笨拙的设计。它最初是作为Windows API的包装器而发展起来的,但后来发展了。由于编译器和语言不支持它们,因此不得不发明一堆小“功能”。没有模板,他们发明了一个字符串类,他们发明了列表类,他们设计了自己的运行时类型标识,等等。
- 封装了20年的Office和Windows演变,其中包括您可能永远不会使用的全部内容:单个和多个文档接口,DDE,COM,COM +,DCOM,文档链接和嵌入(因此您可以将Word文档嵌入到您的应用程序),ActiveX控件(针对Web对象嵌入的演变!),结构化文档存储,序列化和版本控制,自动化(从VBA早期开始),当然还有MVC。最新版本支持Visual Studio样式的窗口停靠和Office功能区。基本上,雷德蒙德20年以来的所有技术都在某个地方。真是巨大!
- 有大量的小陷阱,错误,变通办法,假设,对仍然无法使用的事物的支持,它们会引起问题。您需要非常熟悉许多类的实现以及它们如何交互以在体面的项目中使用它。在调试过程中深入研究MFC源代码很常见。在某个指针为空的情况下找到15年的技术注释仍会导致崩溃。初始化古代文档嵌入内容的假设会以奇怪的方式影响您的应用程序。MFC中没有诸如抽象之类的东西,您需要每天使用它的怪癖和内部知识,它不会隐藏任何东西。而且不要让我开始上课向导。
随着C ++语言的发展,发明了ATL,并提供了模板。ATL展示了如何使用模板来避免MFC库的运行时问题:
- 消息映射:由于它们是基于模板的,因此将检查类型,如果您破坏绑定函数,则不会生成。在MFC中,消息映射是基于宏的,并且是运行时绑定的。如果您错误地定义了函数或宏,这可能会导致奇怪的错误,错误的消息发送到错误的窗口,崩溃,或者只是由于某些错误而无法正常工作而导致崩溃。调试起来更加困难,并且在不注意的情况下更容易破坏。
- COM /自动化:类似于消息映射,COM最初是使用宏在运行时绑定的,需要处理大量错误并引起奇怪的问题。ATL使它成为基于模板的编译时限,并且非常容易处理。
[编辑点缀:在创建ATL时,Microsoft的技术路线图主要集中在“文档管理”上。苹果在台式机出版业务中杀死了他们。Office的“文档链接和嵌入”是增强Office的“文档管理”功能以在此领域竞争的主要组件。COM是为应用程序集成而发明的核心技术,而Document Embedding API是基于COM的。MFC很难用于此用例。ATL是使第三方更容易实现此特定技术并实现COM并利用文档嵌入功能的好解决方案。
这些小的改进使ATL在不需要MFC等所有办公功能的简单应用程序上非常容易处理。它具有简单的UI和一些Office自动化功能。它体积小,速度快,编译时长,可节省大量时间和头痛。MFC有一个庞大的类库,这些类很笨拙,并且很难使用。
不幸的是ATL停滞了。它具有Windows API和COM支持的包装器,然后再也没有超出它的范围。当网络腾飞时,所有这些东西都被当作旧新闻而遗忘了。
[编辑点缀:Microsoft意识到这种“互联网事物”将变得很大。他们的技术路线图发生了巨大变化,将重点放在了分布式事务服务器中的Internet Explorer,Windows Server,IIS,ASP,SQL Server,COM / DCOM上。因此,文档链接和嵌入不再是重中之重。]
MFC的巨大足迹使其无法倾倒,因此它仍在缓慢发展。模板以及其他语言和API增强功能已合并回库中。(直到看到这个问题,我才听说过WTL。:)
归根结底,使用哪一个只是一个优先事项。您需要的大多数功能都在基本OS API中,如果该库中没有合适的包装器,则可以直接从这两个库中调用它们。
基于使用MFC多年,仅凭我的2美分,现在我每天都使用它。当ATL在几个项目中首次发布时,我涉足了两年。那时那是一口新鲜的空气,但从未真正消失过。然后网络出现了,我对此一无所知。
编辑:这个答案具有长寿。由于它一直在我的堆栈溢出页面中弹出,因此我想为原来认为缺少的原始答案添加一些修饰。