Was ist der grundlegende Unterschied zwischen MFC und ATL?

110

Vorausgesetzt , dass ich nur mit ihnen für „normale“ GUI - Programme (ohne COM, kein ActiveX, nichts Besonderes), was der grundlegende Unterschied ist , werde ich zwischen ATL und MFC sehen, mir zu helfen , die man herausfinden , zu benutzen?


Ich habe einige Suchanfragen im Web durchgeführt, aber letztendlich hat keine der Antworten meine Frage wirklich beantwortet:

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

    • "ATL ist eine schnelle und einfache Möglichkeit, eine COM-Komponente in C ++ zu erstellen und einen geringen Platzbedarf zu gewährleisten. Verwenden Sie ATL, um ein Steuerelement zu erstellen, wenn Sie nicht alle integrierten Funktionen benötigen, die MFC automatisch bereitstellt."

      Beantwortet meine Frage nicht wirklich, weil:

      • Ich arbeite nicht mit COM.

      • Bedeutet dies, dass MFC nicht schnell ist? Warum wie?

    • "Mit MFC können Sie vollständige Anwendungen, ActiveX-Steuerelemente und aktive Dokumente erstellen. Wenn Sie bereits ein Steuerelement mit MFC erstellt haben, möchten Sie möglicherweise die Entwicklung in MFC fortsetzen. Wenn Sie ein neues Steuerelement erstellen, sollten Sie ATL verwenden, wenn Sie es nicht benötigen alle in MFC integrierten Funktionen. "

      Beantwortet auch meine Frage nicht, weil:

      • Ich weiß gar nicht, was ActiveX überhaupt ist .

      • Es sieht so aus, als würde Microsoft von der Verwendung von MFC abraten, aber ich kann nicht herausfinden, warum.

      • Was genau ist die "integrierte Funktionalität" von MFC, die ATL nicht bietet?

    • Im Allgemeinen beantwortet dies meine Frage nicht, da es die Nachteile und die Gründe dafür nicht erklärt .

denn direkt oder indirekt scheint alles auf die vorherige Seite zurückzugreifen:

Was ich aktuell beobachtet habe (in den letzten Tagen, als ich versucht habe, beides zu lernen):

  • ATL basiert auf Vorlagen oder Polymorphismus zur Kompilierungszeit.
    • ATL-Methoden sind in der Regel nicht virtuell und geben Referenzen zurück.
  • MFC basiert auf virtuellen Methoden oder Laufzeitpolymorphismus.
    • MFC-Methoden sind in der Regel virtuell und geben Zeiger zurück.

Aber es scheint keinen architektonischen Unterschied zwischen ihnen zu geben :

  • Beide verwenden Message Maps ( BEGIN_MSG_MAPvs. BEGIN_MESSAGE_MAP... große Sache)
  • Beide verpacken Win32-Methoden in Klassen
  • Beide scheinen ähnliche Klassen zu haben CWndvs.CWindow

Aber wenn es dann keinen wirklichen Unterschied gibt, außer dem Aspekt der Kompilierungs- und Laufzeit, warum existieren dann beide? Sollte einer von ihnen nicht genug sein?

Was fehlt mir hier?

user541686
quelle
3
Ich könnte mich irren, aber ich weiß, dass MFC eine ziemlich umfangreiche Laufzeit-DLL erfordert, während ich denke, dass ATL alles in einer Exe zusammenbaut. ATL ist im Allgemeinen leichter. Auch Besuche WTL
Merlyn Morgan-Graham
@ Merlyn: Richtig, aber warum braucht es eine kräftige Laufzeit-DLL? Was ist der grundlegende Unterschied, der dies verursacht?
user541686
1
Der gleiche Unterschied zwischen dem Erben vorkompilierter Klassen, die von einer DLL verknüpft sind, und dem Erben von Vorlagen, die durch Einschließen des Quellcodes / Instanziieren von Vorlagen verknüpft sind. Vorlagen sind im Allgemeinen "Nur-Header" -Bibliotheken. Meine Antwort ist unvollständig, daher in den Kommentaren :) MFC existiert aufgrund der großen Akzeptanz und Abwärtskompatibilität immer noch. Andernfalls hätte MS es weggeworfen, als sie neuere Win32-Wrapper erstellt haben. Sie haben in der Regel lange Supportverträge für ihre Software (unterschiedlich, aber bis zu 10 Jahre). Support ist nicht unvereinbar mit Abwertung.
Merlyn Morgan-Graham
@ Merlyn: Ich verstehe also, dass ich MFC nicht verwenden sollte? Was ist diese "zusätzliche Funktionalität", die sie immer wieder erwähnen? Brauche ich es
user541686
2
@ Merlyn: Von ATL.DLL gehört? Von Begriff "MFC als statische Bibliothek verwenden" gehört?
Ajay

Antworten:

180

Ich denke, die Antwort auf Ihre Frage ist größtenteils historisch, wenn Sie zurückblicken, wie die beiden Bibliotheken im Laufe der Zeit entstanden und sich entwickelt haben.

Die kurze Antwort lautet: Wenn Sie nichts "Besonderes" tun, verwenden Sie ATL. Es eignet sich hervorragend für einfache Benutzeroberflächen mit integriertem COM.

Die lange Antwort: MFC wurde in den frühen 90er Jahren entwickelt, um diese neue Sprache namens C ++ auszuprobieren und auf Windows anzuwenden. Dadurch wurden Office-ähnliche Funktionen für die Entwicklergemeinde verfügbar, wenn das Betriebssystem sie noch nicht hatte.

[Verschönerung bearbeiten: Ich habe nicht bei Microsoft gearbeitet, daher weiß ich nicht, ob Office jemals auf MFC aufgebaut wurde, aber ich denke, die Antwort lautet Nein. Zurück in Win 3.1, Win 95 Tage, erfand das Office UI-Team neue Steuerelemente, packte sie in Bibliotheken, und die Windows- und MFC-Teams bauten Wrapper und API in diese Steuerelemente mit weiterverteilbaren DLLs ein. Ich würde vermuten, dass es zwischen diesen Teams ein bisschen Zusammenarbeit und Code-Sharing gab. Letztendlich würden diese Steuerelemente es in Service Packs oder der nächsten Windows-Version in das Basisbetriebssystem schaffen. Dieses Muster wurde mit der Office-Multifunktionsleiste fortgesetzt, die Windows lange nach der Auslieferung von Office als Add-On-Komponente hinzugefügt wurde und nun Teil des Windows-Betriebssystems ist.]

Zu dieser Zeit war die Bibliothek ziemlich primitiv, sowohl weil die C ++ - Sprache als auch der Compiler neu waren und Microsoft sie im Laufe der Zeit im Zuge der Entwicklung von Office aufbaute.

Aufgrund dieser Geschichte hat MFC:

  1. Hat ein ziemlich klobiges Design. Es begann als Light Wrapper um die Windows-API, wuchs aber. Es gibt eine Reihe kleiner 'Features', die erfunden werden mussten, weil der Compiler und die Sprache sie einfach nicht unterstützten. Es gab keine Vorlagen, sie erfanden eine Zeichenfolgenklasse, sie erfanden Listenklassen, sie entwarfen ihre eigene Laufzeittypidentifikation usw.
  2. Verkapselt 20 Jahre Office- und Windows-Entwicklung, einschließlich einer ganzen Menge Dinge, die Sie wahrscheinlich nie verwenden werden: Einzel- und Mehrfachdokumentschnittstellen, DDE, COM, COM +, DCOM, Dokumentverknüpfung und -einbettung (damit Sie ein Word-Dokument einbetten können) Ihre App, wenn Sie möchten), ActiveX-Steuerelemente (Weiterentwicklung der Objekteinbettung für das Web!), Strukturierte Dokumentenspeicherung, Serialisierung und Versionierung, Automatisierung (ab frühen VBA-Jahren) und natürlich MVC. Die neuesten Versionen unterstützen das Andocken von Fenstern im Visual Studio-Stil und das Office-Menüband. Grundsätzlich ist jede Technologie von Redmond in 20 Jahren irgendwo drin. Es ist einfach riesig!
  3. Hat eine Menge kleiner Fallstricke, Fehler, Problemumgehungen, Annahmen und Unterstützung für Dinge, die noch vorhanden sind und die Sie niemals verwenden werden, und die Probleme verursachen. Sie müssen mit der Implementierung vieler Klassen und deren Interaktion vertraut sein, um sie in einem Projekt mit angemessener Größe verwenden zu können. Das Eintauchen in den MFC-Quellcode während des Debuggens ist üblich. Es kommt immer noch vor, dass ein 15 Jahre alter technischer Hinweis auf einem Zeiger, der null ist und einen Absturz verursacht, gefunden wird. Annahmen zur Initialisierung von Dokumenten zum Einbetten alter Dokumente können sich auf seltsame Weise auf Ihre Anwendung auswirken. In MFC gibt es keine Abstraktion. Sie müssen täglich mit den Macken und Interna arbeiten. Sie verbergen nichts. Und lass mich nicht mit dem Klassenassistenten anfangen.

ATL wurde erfunden, als sich die C ++ - Sprache weiterentwickelte und Vorlagen eintrafen. ATL war ein Beispiel für die Verwendung von Vorlagen, um die Laufzeitprobleme der MFC-Bibliothek zu vermeiden:

  1. Nachrichtenkarten: Da sie vorlagenbasiert sind, werden Typen überprüft, und wenn Sie die gebundene Funktion vermasseln, wird sie nicht erstellt. In MFC sind Nachrichtenzuordnungen makrobasiert und zur Laufzeit gebunden. Dies kann zu seltsamen Fehlern, Nachrichten führen, die an das falsche Fenster weitergeleitet werden, einem Absturz, wenn Sie eine Funktion oder ein Makro falsch definiert haben, oder einfach nicht funktionieren, weil etwas nicht richtig angeschlossen ist. Viel schwieriger zu debuggen und leichter zu brechen, ohne es zu merken.
  2. COM / Automatisierung: Ähnlich wie bei Nachrichtenzuordnungen war COM ursprünglich zur Laufzeit mithilfe von Makros gebunden, was viel Fehlerbehandlung erforderte und seltsame Probleme verursachte. ATL machte es vorlagenbasiert, kompilierte zeitgebunden und viel, viel einfacher zu handhaben.

[Verschönerung bearbeiten: Zum Zeitpunkt der Erstellung von ATL konzentrierte sich die technische Roadmap von Microsoft hauptsächlich auf das Dokumentenmanagement. Apple hat sie im Desktop-Publishing-Geschäft umgebracht. Office 'Dokumentverknüpfung und -einbettung' war eine Hauptkomponente zur Verbesserung der 'Dokumentenverwaltung' von Office, um in diesem Bereich wettbewerbsfähig zu sein. COM war eine Kerntechnologie, die für die Anwendungsintegration erfunden wurde, und APIs zum Einbetten von Dokumenten basierten auf COM. MFC war für diesen Anwendungsfall schwierig zu verwenden. ATL war eine gute Lösung, um Drittanbietern die Implementierung von COM und die Verwendung von Funktionen zum Einbetten von Dokumenten zu erleichtern.]

Diese kleinen Verbesserungen erleichtern die Handhabung von ATL in einer einfachen Anwendung, die nicht alle Office-ähnlichen Funktionen von MFC benötigt. Etwas mit einer einfachen Benutzeroberfläche und etwas eingebauter Office-Automatisierung. Es ist klein, schnell, kompilierzeitgebunden und spart Ihnen viel Zeit und Kopfschmerzen. MFC hat eine riesige Bibliothek von Klassen, die klobig und schwierig zu bearbeiten sein können.

Leider stagnierte ATL. Es hatte Wrapper für die Windows-API und die COM-Unterstützung, und dann ging es nie wirklich darüber hinaus. Als das Web startete, wurde all dieses Zeug als alte Nachricht irgendwie vergessen.

[Verschönerung bearbeiten: Microsoft erkannte, dass dieses "Internet-Ding" groß werden würde. Die technische Roadmap wurde drastisch geändert, um sich auf Internet Explorer, Windows Server, IIS, ASP, SQL Server und COM / DCOM in Distributed Transaction Server zu konzentrieren. Das Verknüpfen und Einbetten von Dokumenten hatte also keine hohe Priorität mehr.]

Der enorme Fußabdruck von MFC machte es ihnen unmöglich, sich zu entleeren, so dass es sich immer noch langsam entwickelt. Vorlagen sowie andere Sprach- und API-Verbesserungen wurden wieder in die Bibliothek aufgenommen. (Ich hatte erst von WTL gehört, als ich diese Frage sah. :)

Letztendlich ist es einfach eine Frage der Präferenz, welche man verwendet. Die meisten Funktionen, die Sie benötigen, befinden sich in der Basis-Betriebssystem-API, die Sie direkt aus beiden Bibliotheken aufrufen können, wenn die Bibliothek keinen geeigneten Wrapper enthält.

Nur meine 2 Cent basieren auf der Verwendung von MFC seit vielen Jahren, und ich benutze es jetzt täglich. Ich habe mich mit ATL beschäftigt, als es für ein paar Jahre zum ersten Mal für einige Projekte veröffentlicht wurde. Es war damals ein Hauch frischer Luft, ging aber nie wirklich irgendwohin. Und dann kam das Web und ich vergaß alles.


Bearbeiten: Diese Antwort hat eine überraschende Langlebigkeit. Da es immer wieder auf meiner Stapelüberlaufseite auftaucht, dachte ich, ich würde die ursprüngliche Antwort, die mir fehlte, etwas verschönern.

Jay
quelle
39
+1 Ich wünschte ich könnte +10 dies. Vielen Dank für die hervorragende Beschreibung der Geschichte - sie ist sehr gut geschrieben und informativ! :)
user541686
3
Ich wollte nur erwähnen ... Ich habe ein paar Tage lang MFC verwendet und dann zu ATL / WTL gewechselt, das ich jetzt schon eine Weile benutze. Und es ist verdammt großartig. Ich werde MFC wahrscheinlich nie wieder anschauen.
user541686
1
Erstellt Microsoft neue Programme mit beiden oder haben sie beschlossen, eines übereinander zu verwenden?
Der Muffin-Mann
1
Ich dachte, ich wüsste den Unterschied ... aber ich habe noch nie eine so schöne und ausführliche Erklärung gesehen ... Daumen hoch ... Danke eine Tonne :)
Shivi
1
Die beste Antwort, die ich jemals zu diesem Thema gelesen habe; Sie sollten einen Artikel daraus machen, einschließlich WTL
Pat
21

Viele Leute, die beide verwendet haben, haben mir gesagt, dass ihre Programmiererfahrung mit ATL weniger schmerzhaft war als mit MFC. Ihre kompilierte ausführbare Datei wird mit ATL auch viel kleiner.

Ich empfehle Ihnen , sich WTL anzuschauen , da es auf ATL aufbaut.

Was ist diese "zusätzliche Funktionalität", die sie immer wieder erwähnen? Brauche ich es

Wenn Sie Ihre Anforderungen definieren, ist es möglicherweise einfacher zu beantworten, wenn Sie die Verwendung von MFC vermeiden können. Leider ist "nichts Besonderes" nicht exklusiv genug. Es kann hilfreich sein, zu berücksichtigen, welche Funktionen Sie verwenden möchten (welche Steuerelemente, welche Frameworks / Technologien / vorhandenen Bibliotheken Sie verwenden möchten usw.).

In diesem Artikel werden jedoch einige Funktionen in MFC beschrieben, die von WTL / ATL nicht direkt unterstützt werden.

MFC hat sich auch so weit entwickelt, dass es viele wünschenswerte Funktionen wie MAPI, Unterstützung für die anderen Windows-Logo-Anforderungen, Sockets, Dokumente (wenn Sie dieses Muster mögen und / oder verwenden) und zusammengesetzte Dokumentdateien unterstützt. WTL hat seinen Anteil an coolen Features, aber MFC ist der klare Feature-Champion. Beide Umgebungen unterstützen gerahmte Hauptfensterarchitekturen (Rahmenfenster mit separatem Ansichtsfenster), SDI- und MDI-Anwendungen, geteilte Fenster, dialogbasierte Anwendungen und verschiedene COM-basierte Klassen für die COM-Unterstützung.

Merlyn Morgan-Graham
quelle
3
Jays Antwort hat diesen Takt. Lassen Sie dies für den Link zum Artikel, in dem einige der Unterschiede erläutert werden.
Merlyn Morgan-Graham
9

ATL ist eine Reihe von Klassen, die die Implementierung von COM-Objekten vereinfachen sollen.

Sie können es ohne MFC verwenden. Bei meiner Arbeit verwenden wir ATL, um COM-Schnittstellen mit Rechencode zu versehen. Es ist keine GUI beteiligt, es ist für uns, diesen Rechencode von z. Excel VBA.

Schauen Sie sich eine COM-Anleitung / ein COM-Tutorial an, um zu sehen, was es abstrahiert.

MFC ist nur eine Reihe von GUI-Wrapper-Klassen für die Win32-API. Schauen Sie sich ein Win32-API-Tutorial an, um zu sehen, was es abstrahiert.

Alexandre C.
quelle
ATL kann auch ohne COM verwendet werden. Viele Klassen haben keine Beziehung zu COM, was bei der Betrachtung von WTL noch deutlicher wird.
0xC0000022L
1
@ 0xC0000022L: Ich war mir nicht bewusst CWindowImplund Freunde, als ich dies schrieb. Jetzt, da ich mehr Erfahrung mit ATL habe, könnte ich versuchen, diese Antwort neu zu schreiben. Insbesondere kann ATL / WTL praktisch alle MFC ersetzen.
Alexandre C.