В чем принципиальная разница между MFC и ATL? - PullRequest
98 голосов
/ 27 августа 2011

Предполагая, что я только , использую их для "обычных" программ с графическим интерфейсом (без COM, без ActiveX, ничего особенного), в чем заключается принципиальная разница между ATL и MFC, чтобы помочьмне выяснить, какой из них использовать?


Я сделал несколько поисков в Интернете, но в конечном итоге ни один из ответов не ответил на мой вопрос:

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

    • "ATL - это быстрый и простой способ создать COM-компонент в C ++ и сохранить небольшой размер. Используйте ATL для создания элемента управления, есливам не нужны все встроенные функции, которые автоматически предоставляет MFC. "

      Не отвечает на мой вопрос, потому что:

      • Iне работает с COM.

      • Означает ли это, что MFC не быстро?Почему / как?

    • "MFC позволяет создавать полные приложения, элементы управления ActiveX и активные документы. Если вы уже создали элемент управления с помощью MFCвы можете продолжить разработку в MFC. При создании нового элемента управления рассмотрите возможность использования ATL, если вам не нужны все встроенные функции MFC. "

      Также не отвечает на мой вопроспотому что:

      • Я даже не знаю, что вообще такое ActiveX .

      • Это выглядиткак будто Microsoft препятствует использованию MFC, но я не могу понять, почему.

      • Что именно является MFC "встроеннымв функциональности ", которую ATL не предоставляет?

    • В общем, это не отвечает на мой вопрос, потому что это не объясняет недостатки и причины, стоящие за ними.

потому что прямо или косвенно все, кажется, связано с прежнимСтраница ious:

Что у меня есть в настоящее время наблюдается (в течение последних нескольких дней при попытке изучить оба):

  • ATL основан на шаблонах или полиморфизме во время компиляции.
    • Методы ATL, как правило, не являются виртуальными и имеют тенденцию возвращать ссылки.
  • MFC основан на виртуальных методах или полиморфизме времени выполнения.
    • Методы MFC, как правило, являются виртуальными и имеют тенденцию возвращать указатели.

Но между ними , похоже, нет никакой архитектурной разницы:

  • Оба используют карты сообщений (BEGIN_MSG_MAP против BEGIN_MESSAGE_MAP ... большое дело)
  • Оба метода Win32 заключают в классы
  • Кажется, что у обоих одинаковые классы CWnd против CWindow

Но тогда, если нет реальной разницы, за исключением аспекта времени компиляции и времени выполнения, то почему они обасуществовать?Разве одного из них не должно быть достаточно?

Что мне здесь не хватает?

Ответы [ 3 ]

159 голосов
/ 27 августа 2011

Я думаю, что ответ на ваш вопрос в основном исторический, если вы посмотрите назад на то, как две библиотеки возникли и эволюционировали во времени.

Краткий ответ: если вы не делаете ничего «причудливого»,использовать 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:

  1. имеет довольно неуклюжий дизайн.Это началось как легкая оболочка для Windows API, но выросло.Есть несколько маленьких «функций», которые нужно было придумать, потому что компилятор и язык просто не поддерживали их.Там не было шаблонов, они изобрели строковый класс, они изобрели списочные классы, они разработали свою собственную идентификацию типов во время выполнения и т. Д.
  2. Инкапсулирует 20 лет эволюции Office и Windows, которая включает в себя целую кучу вещейвы, вероятно, никогда не будете использовать: интерфейсы для одного и нескольких документов, DDE, COM, COM +, DCOM, связывание и встраивание документов (так что вы можете встроить текстовый документ в свое приложение, если хотите), элементы управления ActiveX (эволюция встраивания объектов дляweb!), структурированное хранение документов, сериализация и управление версиями, автоматизация (с ранних лет VBA) и, конечно, MVC.В последних версиях поддерживается стыковка окон в стиле Visual Studio и лента Office.По сути, каждая технология из Редмонда за 20 лет где-то там есть.Это просто ОГРОМНО!
  3. Имеет массу мелких ошибок, ошибок, обходных путей, предположений, поддержки вещей, которые все еще там, которые вы никогда не будете использовать, и они вызывают проблемы.Вы должны быть хорошо знакомы с реализацией многих классов и их взаимодействием, чтобы использовать их в проекте приличного размера.Вхождение в исходный код MFC во время отладки является распространенным явлением.Поиск 15-летней технической записки о том, что какой-то указатель является нулевым, вызывает сбой.Предположения об инициализации древних документов встраивают вещи могут странным образом повлиять на ваше приложение.В MFC нет такой вещи, как абстракция, вам нужно ежедневно работать с ее причудами и внутренностями, это ничего не скрывает.И не начинайте меня с мастера классов.

ATL был изобретен по мере развития языка C ++ и появления шаблонов.ATL продемонстрировал, как использовать шаблоны, чтобы избежать проблем во время выполнения библиотеки MFC:

  1. Карты сообщений: поскольку они основаны на шаблонах, типы проверяются, и если вы облажаете границуфункция, это не построить.В сообщениях MFC карты основаны на макросах и ограничены во время выполнения.Это может вызвать странные ошибки, сообщение, перенаправленное в неправильное окно, сбой, если у вас неправильно задана функция или макрос, или просто не работает, потому что что-то неправильно подключено.Гораздо сложнее отлаживать и легче ломать, не замечая.
  2. 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, когда он был впервые выпущен на нескольких проектах в течение нескольких лет.В те дни это был глоток свежего воздуха, но на самом деле он никуда не уходил.А потом появилась Интернет, и я забыл обо всем.


Редактировать: Этот ответ имеет удивительную долговечность.Поскольку он продолжает появляться на моей странице переполнения стека, я решил добавить некоторые украшения к первоначальному ответу, которого, как мне казалось, не хватает.

18 голосов
/ 27 августа 2011

Мне сказали многие люди, которые использовали оба, что их опыт программирования был менее болезненным с ATL, чем с MFC. Ваш скомпилированный исполняемый файл также будет намного меньше с ATL.

Я рекомендую вам взглянуть на WTL , так как он основан на ATL.

Что это за «дополнительная функциональность», которую они постоянно упоминают? Мне это нужно?

Если вы определите свои требования, вам будет проще ответить, если вы сможете избежать использования MFC. К сожалению, «ничего особенного» недостаточно эксклюзивно. Понимание того, какие функции вы намереваетесь использовать, может быть более полезным (какие элементы управления, какие платформы / технологии / существующие библиотеки вы хотите использовать и т. Д.).

Но вот статья, которая описывает некоторые функции в MFC, которые не поддерживаются напрямую WTL / ATL.

MFC также развился до такой степени, что он поддерживает множество желаемых функций, таких как MAPI, поддержка других требований к логотипу Windows, сокеты, документы (если вам нравится и / или используют этот шаблон) и файлы составных документов. У WTL есть своя классная функция, но MFC - явный победитель. Обе среды поддерживают рамочные архитектуры главного окна (рамочное окно с отдельным окном просмотра), приложения SDI и MDI, разделенные окна, диалоговые приложения и различные COM-классы для поддержки COM.

9 голосов
/ 27 августа 2011

ATL - это набор классов, предназначенных для упрощения реализации COM-объектов.

Вы можете использовать его без MFC.На моей работе мы используем ATL для предоставления COM-интерфейсов вычислительному коду.Там нет графического интерфейса, мы можем вызвать этот вычислительный код, например, из.Excel VBA.

Посмотрите какое-нибудь руководство / руководство по COM, чтобы увидеть, как оно абстрагируется.

MFC - это просто набор классов-оболочек GUI для Win32 API.Посмотрите какое-нибудь руководство по Win32 API, чтобы увидеть, как оно абстрагируется.

...