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:
Wie entscheide ich, ob ich ATL, MFC, Win32 oder CLR für ein neues C ++ - Projekt verwenden soll?
http://www.codeguru.com/forum/archive/index.php/t-64778.html
etc.
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_MAP
vs.BEGIN_MESSAGE_MAP
... große Sache) - Beide verpacken Win32-Methoden in Klassen
- Beide scheinen ähnliche Klassen zu haben
CWnd
vs.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?
quelle
Antworten:
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:
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:
[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.
quelle
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.
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.
quelle
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.
quelle
CWindowImpl
und 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.