Я думаю, что ответ на ваш вопрос в основном исторический, если вы посмотрите назад на то, как две библиотеки возникли и эволюционировали во времени.
Краткий ответ: если вы не делаете ничего «причудливого»,использовать ATL.Он отлично подходит для простых пользовательских интерфейсов с добавленным COM.
Длинный ответ: MFC был создан в начале 90-х годов, чтобы опробовать этот новый язык под названием C ++ и применить его к Windows.Это сделало Office-подобные функции доступными для сообщества разработчиков, когда у ОС их еще не было.
[Редактировать приукрашивание: я не работал в Microsoft, поэтому я не знаю, был ли Office когда-либо построен на MFC, но я думаю, что ответ - нет.В Win 3.1, Win 95 дней команда Office UI изобретала новые элементы управления, упаковывала их в библиотеки, а затем команды Windows и MFC включали обертки и API для этих элементов управления с распространяемыми библиотеками.Я полагаю, что между этими командами было немного сотрудничества и совместного использования кода.В конечном итоге эти элементы управления превратятся в базовую операционную систему в пакетах обновления или в следующей версии Windows.Этот паттерн продолжился с ленты Office, которая была добавлена в Windows как дополнительный компонент после поставки Office, и теперь является частью ОС Windows.]
В то время библиотека была довольно примитивной, посколькуязык C ++ и компилятор были новыми, а Microsoft создавала его с течением времени по мере развития Office.
Из-за этой истории MFC:
- имеет довольно неуклюжий дизайн.Это началось как легкая оболочка для Windows API, но выросло.Есть несколько маленьких «функций», которые нужно было придумать, потому что компилятор и язык просто не поддерживали их.Там не было шаблонов, они изобрели строковый класс, они изобрели списочные классы, они разработали свою собственную идентификацию типов во время выполнения и т. Д.
- Инкапсулирует 20 лет эволюции Office и Windows, которая включает в себя целую кучу вещейвы, вероятно, никогда не будете использовать: интерфейсы для одного и нескольких документов, DDE, COM, COM +, DCOM, связывание и встраивание документов (так что вы можете встроить текстовый документ в свое приложение, если хотите), элементы управления ActiveX (эволюция встраивания объектов дляweb!), структурированное хранение документов, сериализация и управление версиями, автоматизация (с ранних лет VBA) и, конечно, MVC.В последних версиях поддерживается стыковка окон в стиле Visual Studio и лента Office.По сути, каждая технология из Редмонда за 20 лет где-то там есть.Это просто ОГРОМНО!
- Имеет массу мелких ошибок, ошибок, обходных путей, предположений, поддержки вещей, которые все еще там, которые вы никогда не будете использовать, и они вызывают проблемы.Вы должны быть хорошо знакомы с реализацией многих классов и их взаимодействием, чтобы использовать их в проекте приличного размера.Вхождение в исходный код MFC во время отладки является распространенным явлением.Поиск 15-летней технической записки о том, что какой-то указатель является нулевым, вызывает сбой.Предположения об инициализации древних документов встраивают вещи могут странным образом повлиять на ваше приложение.В MFC нет такой вещи, как абстракция, вам нужно ежедневно работать с ее причудами и внутренностями, это ничего не скрывает.И не начинайте меня с мастера классов.
ATL был изобретен по мере развития языка C ++ и появления шаблонов.ATL продемонстрировал, как использовать шаблоны, чтобы избежать проблем во время выполнения библиотеки MFC:
- Карты сообщений: поскольку они основаны на шаблонах, типы проверяются, и если вы облажаете границуфункция, это не построить.В сообщениях MFC карты основаны на макросах и ограничены во время выполнения.Это может вызвать странные ошибки, сообщение, перенаправленное в неправильное окно, сбой, если у вас неправильно задана функция или макрос, или просто не работает, потому что что-то неправильно подключено.Гораздо сложнее отлаживать и легче ломать, не замечая.
- COM / Автоматизация: Подобно картам сообщений, COM изначально был ограничен во время выполнения с помощью макросов, что требовало много обработки ошибок и вызывало странные проблемы.ATL сделала его основанным на шаблонах, скомпилированным по времени, и намного, намного легче справиться.
[Редактировать приукрашивание: во время создания ATL техническая дорожная карта Microsoft была в основном сосредоточена на «Управлении документами»».Apple убивала их в бизнесе настольных издательских систем.«Связывание и внедрение документов» в Office было основным компонентом для расширения возможностей Office в области управления документами, чтобы конкурировать в этой сфере.COM была основной технологией, изобретенной для интеграции приложений, а API встраивания документов основывались на COM.MFC было трудно использовать для этого варианта использования.ATL был хорошим решением, чтобы упростить эту конкретную технологию для сторонних разработчиков для внедрения COM и использования функций встраивания документов.]
Эти небольшие улучшения значительно упрощают работу с ATL в простом приложении, которому не нужно всеофис, как особенности MFC.Кое-что с простым пользовательским интерфейсом и некоторой автоматизацией Office. Это мало, это быстро, это требует времени компиляции, экономя ваше время и головную боль.MFC имеет огромную библиотеку классов, которые могут быть неуклюжими и трудными для работы.
К сожалению, ATL застаивается.У него были обертки для поддержки Windows API и COM, а затем он никогда не выходил за рамки этого.Когда Интернет заработал, все эти вещи были как бы забыты как старые новости.
[Править Украшение: Microsoft поняла, что эта «вещь Интернета» будет большой.Их техническая дорожная карта радикально изменилась, чтобы сосредоточиться на Internet Explorer, Windows Server, IIS, ASP, SQL Server, COM / DCOM на сервере распределенных транзакций.Поэтому связывание и встраивание документов больше не являлось приоритетом.]
Огромная площадь MFC не позволяла им создавать дампы, поэтому он все еще медленно развивается.Шаблоны были включены обратно в библиотеку, а также другие улучшения языка и API.(Я не слышал о WTL, пока не увидел этот вопрос.:)
В конечном счете, какой из них использовать, это просто вопрос предпочтений.Большинство функций, которые вам нужны, находятся в API базовых ОС, которые можно вызывать напрямую из любой библиотеки, если в библиотеке нет подходящей оболочки.
Только мои 2 цента, основанные на использовании MFC в течение многих лети я использую его сейчас ежедневно.Я увлекался ATL, когда он был впервые выпущен на нескольких проектах в течение нескольких лет.В те дни это был глоток свежего воздуха, но на самом деле он никуда не уходил.А потом появилась Интернет, и я забыл обо всем.
Редактировать: Этот ответ имеет удивительную долговечность.Поскольку он продолжает появляться на моей странице переполнения стека, я решил добавить некоторые украшения к первоначальному ответу, которого, как мне казалось, не хватает.