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:
- 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.
- 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!
- 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:
- 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.
- 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.