В чем принципиальная разница между MFC и ATL?


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


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

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

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

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

      • Я не работать с COM.

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

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

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

      • Я даже не знаю, что такое ActiveX и в первую очередь.

      • похоже, что Microsoft не поощряет использование MFC, но я не могу понять, почему.

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

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

потому что прямо или косвенно, все вроде ссылка на предыдущую страницу:

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

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

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

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

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

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

3 91

3 ответа:

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

короткий ответ, если вы не делаете ничего "причудливого", используйте ATL. Это отлично подходит для простых пользовательских интерфейсов с COM бросили В.

долгий ответ: MFC был построен в начале 90-х годов, чтобы попробовать этот новый язык под названием C++ и применить его к Windows. Это сделало Office как функции, доступные для сообщества разработчиков, когда в ОС их еще не было.

[Edit embellishment: я не работал в Microsoft, поэтому я не знаю, был ли офис когда-либо построен на MFC, но я думаю, что ответ нет. Вернувшись в Win 3.1, Win 95 days, команда Office UI изобретет новые элементы управления, упакует их в библиотеки, а затем команды Windows и MFC будут включать оболочки и API для этих элементов управления с распространяемыми DLL. Я бы предположил, что между этими командами было немного сотрудничества и совместного использования кода. В конце концов те элементы управления будут входить в базовую операционную систему в пакетах обновления или в следующей версии Windows. Этот шаблон продолжался с лентой Office, которая была добавлена в Windows в качестве дополнительного компонента после отправки Office и теперь является частью ОС Windows.]

в то время библиотека была довольно примитивной, как из-за того, что язык C++ и компилятор были новыми, так и Microsoft строила его с течением времени по мере развития Office.

из-за этой истории, МФЦ:

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

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

  1. карты сообщений: поскольку они основаны на шаблонах, типы проверяются, и если вы испортите связанную функцию, она не будет построена. В MFC карты сообщений основаны на макросах и привязаны к времени выполнения. Это может привести к нечетным ошибкам, сообщению, направленному в неправильное окно, сбою, если у вас есть функция или макрос, определенные неправильно, или просто не работают, потому что что-то не подключено правильно. Гораздо сложнее отлаживать, и легче сломать без замечающий.
  2. COM / Automation: подобно картам сообщений, COM изначально был привязан к времени выполнения с помощью макросов, требуя много ошибок и вызывая нечетные проблемы. ATL сделал его шаблонным, привязанным к времени компиляции и намного, намного проще в работе.

[Edit Embellishment: на момент создания ATL техническая дорожная карта Microsoft была в основном сосредоточена на "управлении документами". Apple убивала их в настольном издательском бизнесе. Служебный Документ Увязка и внедрение "были основным компонентом для повышения" управления документами " функции офиса, чтобы конкурировать в этом пространстве. COM была основной технологией, изобретенной для интеграции приложений, а API встраивания документов были основаны на COM. MFC было трудно использовать для этого случая использования. ATL был хорошим решением, чтобы сделать эту конкретную технологию проще для 3-й стороны реализовать COM и использовать функции встраивания документов.]

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

к сожалению ATL застопорился. У него были обертки для поддержки Windows API и COM, а затем он никогда не выходил за рамки этого. Когда паутина взлетела, все это все это было забыто, как старые новости.

[Edit Embellishment: Microsoft поняла, что эта "интернет-вещь" будет большой. Их техническая дорожная карта резко изменилась, чтобы сосредоточиться на Internet Explorer, Windows Server, IIS, ASP, SQL Server, COM/DCOM в Distributed Transaction Server. Таким образом, связывание и внедрение документа больше не было высоким приоритетом.]

огромный след МФЦ сделал невозможным для них сброс, поэтому он все еще развивается медленно. Шаблоны были включены обратно в библиотеку, а также другие улучшения языка и API. (Я не слышал о WTL, пока не увидел этот вопрос. :)

в конечном итоге, какой из них использовать-это просто вопрос предпочтений. Большинство функций, которые вам нужны, находятся в базовом API ОС, который вы можете вызвать непосредственно из любой библиотеки, если в библиотеке нет подходящей оболочки.

просто мои 2 цента, основанные на использовании MFC в течение многих лет, и я использую его теперь ежедневно. Я баловался в АТЛ когда он был впервые выпущен на нескольких проектах в течение пары лет. Это был глоток свежего воздуха в те дни, но никогда не пошел никуда. А потом появилась паутина, и я совсем забыл об этом.


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

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

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

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

Если вы определяете свои требования, было бы легче ответить, если вы можете избежать с помощью МФЦ. К сожалению, "ничего необычного" недостаточно эксклюзивно. Быть включительным в отношении того, какие функции вы собираетесь использовать, может быть более полезным (какие элементы управления, какие фреймворки/технологии/существующие библиотеки вы хотите использовать и т. д.).

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

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

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

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

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

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