Quelle est la différence fondamentale entre MFC et ATL?

en supposant que je suis seulement en les utilisant pour des programmes GUI" normaux " (pas de COM, PAS D'ActiveX, rien de fantaisie), Quelle est la différence fondamentale que je vais voir entre ATL et MFC, pour m'aider à comprendre lequel utiliser?


j'ai fait quelques recherches sur le web, mais finalement aucune des réponses n'a vraiment répondu à ma question:

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

    • "ATL est un moyen rapide et facile de créer un composant COM en C++ et de maintenir une petite empreinte. Utilisez ATL pour créer un contrôle si vous n'avez pas besoin de toutes les fonctionnalités intégrées que MFC fournit automatiquement."

      ne répond pas vraiment à ma question, parce que:

      • je suis Je ne travaille pas avec COM.

      • est-ce que cela implique MFC n'est pas rapide? Pourquoi/comment?

    • "MFC vous permet de créer des applications complètes, des contrôles ActiveX et des documents actifs. Si vous avez déjà créé un contrôle avec MFC, vous pouvez poursuivre le développement de MFC. Lors de la création d'un nouveau contrôle, envisagez D'utiliser ATL si vous n'avez pas besoin de tous les MFC fonctionnalité intégrée."

      ne répond pas non plus à ma question, parce que:

      • Je ne sais pas vraiment ce Qu'ActiveX est en premier lieu.

      • il semble que Microsoft décourage l'utilisation de MFC, mais je ne peux pas comprendre pourquoi.

      • qu'est-Ce exactement est MFC "built-in fonctionnalité de" ATL ne fournit pas?

    • en général, cela ne répond pas à ma question parce que cela n'explique pas les inconvénients et les raisons derrière eux.

parce que directement ou indirectement, tout semble renvoyer à la page précédente:

ce que j'ai actuellement observé (dans les derniers jours, tout en essayant d'apprendre les deux):

  • ATL est basé sur modèles de, ou au moment de la compilation du polymorphisme.
    • les méthodes ATL ont tendance à être non-virtuelles et à renvoyer des références.
  • MFC est basé sur des méthodes virtuelles, ou run-time polymorphism.
    • les méthodes MFC ont tendance à être virtuelles, et ont tendance à renvoyer des pointeurs.

mais là ne semble pas être une différence architecturale entre eux :

  • tous deux utilisent des cartes de messages ( BEGIN_MSG_MAP vs. BEGIN_MESSAGE_MAP ... big deal)
  • les deux méthodes Win32 wrap en classes
  • les deux semblent avoir des classes similaires CWnd vs. CWindow

mais alors, s'il n'y a pas de différence réelle sauf pour l'aspect temps de compilation VS temps d'exécution, alors pourquoi les deux existent-ils? Ne devrait pas être suffisant?

Qu'est-ce que je rate ici?

91
demandé sur Community 2011-08-27 05:49:02

3 réponses

je pense que la réponse à votre question Est principalement historique, si vous regardez en arrière comment les deux bibliothèques ont commencé et évolué au fil du temps.

la réponse courte est, si vous ne faites rien de" fantaisie", utilisez ATL. Il est idéal pour les interfaces utilisateur simples avec COM jeté dans.

la longue réponse: MFC a été construit au début des années 90 pour essayer ce nouveau langage appelé C++ et l'appliquer à Windows. Il a mis Office comme les fonctionnalités disponibles à la communauté de développement alors que L'OS ne les avait pas encore.

[Edit embellissement: Je n'ai pas travaillé chez Microsoft, donc je ne sais pas si Office a été construit sur MFC, mais je pense que la réponse est non. De retour dans Win 3.1, Win 95 days, L'équipe de L'interface de bureau inventait de nouveaux contrôles, les empaquetait dans les bibliothèques, puis les équipes Windows et MFC incorporaient des wrappers et des API à ces contrôles avec des dlls redistribuables. Je suppose qu'il y a eu un peu de collaboration et de partage de code entre ces équipes. Finalement, ces commandes le rendraient dans le système d'exploitation de base en service packs ou la prochaine version de Windows. Ce modèle a continué avec le ruban de bureau qui a été ajouté dans les fenêtres comme un composant supplémentaire bien après Bureau expédié, et fait maintenant partie de L'OS de Windows.]

à cette époque, la bibliothèque était assez primitive, à la fois en raison du langage C++ et du compilateur étant nouveaux, et Microsoft le construisant au fil du temps comme Office évoluait.

en raison de cette histoire, MFC:

  1. a un design assez clair. Il a commencé comme un enveloppeur de lumière autour de L'API Windows, mais a grandi. Il y a un tas de petites "fonctionnalités" qui ont dû être inventées parce que le compilateur et le langage ne les supportaient tout simplement pas. Il n'y avait pas de gabarits, ils ont inventé une classe de corde, ils ont inventé des classes de liste, ils ont conçu leur propre identification de type de temps d'exécution, etc.
  2. Encapsule 20 ans D'évolution de Office et Windows, qui comprend une charge de merde entière de trucs que vous ne serez probablement jamais utiliser: interfaces de documents simples et multiples, DDE, COM, COM+, DCOM, document Linking and Embedding (de sorte que vous pouvez intégrer un document word dans votre application si vous le souhaitez), contrôles ActiveX (évolution de l'objet embedding pour le web!), Stockage structuré de documents, Serialization et Versioning, Automation (à partir des premières années VBA), et bien sûr MVC. Les dernières versions sont compatibles avec L'arrimage visuel de la fenêtre du Studio, et le ruban de bureau. En gros, chaque technologie de Redmond en 20 ans est là quelque part. C'est juste ÉNORME!
  3. a une tonne de petites gotchas, bogues, solutions de rechange, hypothèses, soutien pour les choses qui sont encore là que vous ne serez jamais utiliser, et ils causent des problèmes. Vous devez être intimement familier avec la mise en œuvre de nombreux cours et la façon dont ils interagissent pour l'utiliser sur un projet de taille décente. Analyse du code source de la CFM pendant le débogage est commun. Trouver un vieux de 15 ans note technique sur un pointeur étant nul causant un accident se produit toujours. Les hypothèses sur l'initialisation de documents anciens enrobant des choses peuvent affecter votre application de manière étrange. Il n'y a pas d'abstraction dans le MFC, vous devez travailler avec ses bizarreries et internes tous les jours, il ne cache rien. Et ne me lance pas sur le magicien de la classe.

ATL a été inventé alors que le langage C++ évoluait, et les modèles sont arrivés. ATL a été une vitrine sur la façon d'utiliser les modèles pour éviter les problèmes d'exécution de la bibliothèque MFC:

  1. les mappages de Message: Puisqu'ils sont basés sur un modèle, les types sont vérifiés, et si vous foirez la fonction liée, elle ne se construit pas. Dans les MFC, les cartes de messages sont basées sur des macros et sont limitées dans le temps. Cela peut causer des bugs impairs, un message routé vers la mauvaise fenêtre, un crash si vous avez une fonction ou une macro mal définie, ou tout simplement ne pas fonctionner parce que quelque chose n'est-ce pas accroché en haut à droite. Beaucoup plus difficile à déboguer, et plus facile à briser sans s'en apercevoir.
  2. COM / Automation: semblable aux cartes de messages, COM était à l'origine limité dans le temps d'exécution en utilisant des Macros, exigeant beaucoup de manipulation d'erreur et de causer des problèmes étranges. L'ATL l'a rendu basé sur un modèle, compilé dans le temps, et beaucoup, beaucoup plus facile à traiter.

[Edit embellissement: au moment où ATL a été créé, la carte routière technique de Microsoft était principalement axée sur "Document Management". Apple les tuait dans le domaine de l'éditique. La "mise en relation et intégration des documents" était un élément essentiel de l'amélioration des caractéristiques de la "gestion des documents" de L'Office pour être compétitif dans cet espace. COM était une technologie de base inventée pour l'intégration des applications, et les API D'intégration de documents étaient basées sur COM. MFC était difficile à utiliser pour ce cas d'utilisation. ATL était une bonne solution pour rendre cette technologie particulière plus facile à des tiers pour mettre en œuvre COM et utiliser fonctions d'intégration de documents.]

ces petites améliorations rendent ATL beaucoup plus facile à traiter sur une application simple qui n'a pas besoin de tous les bureaux comme les caractéristiques de MFC. Quelque chose avec une simple interface utilisateur et un peu de bureautique. C'est petit, c'est rapide, ça compile dans le temps, ça vous fait gagner du temps et des maux de tête. MFC a une énorme bibliothèque de classes qui peuvent être maladroit, et difficile à travailler.

malheureusement ATL stagné. Il avait des wrappers pour les API windows et COM de soutien, et puis il n'a jamais vraiment allé au-delà. Quand le Web a décollé, tout ça a été oublié comme une vieille nouvelle.

[éditer embellissement: Microsoft a réalisé que cette 'chose Internet' allait être grand. Leur carte routière technique a radicalement changé pour se concentrer sur Internet Explorer, Windows Server, IIS, ASP, SQL Server, COM/DCOM dans Distributed Transaction Server. Ainsi, le lien entre les documents et leur intégration n'était plus un priorité.]

l'énorme empreinte de MFC les empêchait de se décharger, donc elle évolue encore lentement. Des modèles ont été intégrés à la bibliothèque, ainsi que d'autres améliorations linguistiques et API. (Je n'avais pas entendu parler de WTL avant de voir cette question. :)

finalement, lequel utiliser est simplement une question de préférence. La majorité des fonctionnalités dont vous avez besoin se trouvent dans L'API du système D'exploitation de base, que vous pouvez appeler directement depuis l'une ou l'autre des bibliothèques, si il n'y a pas d'emballage approprié dans la bibliothèque.

juste mes 2 cents basé sur l'utilisation de MFC depuis de nombreuses années, et je l'utilise maintenant tous les jours. J'ai travaillé sur ATL quand il est sorti pour la première fois sur quelques projets pendant quelques années. C'était une bouffée d'air frais à l'époque, mais ça n'a jamais vraiment mené nulle part. Et puis le Web est arrivé et j'ai tout oublié.


Edit: Cette réponse est étonnante longévité. Comme il n'arrête pas de surgir dans mon empilez la page de débordement, j'ai pensé que je voudrais ajouter un peu d'embellissement à la réponse originale que je pensais manquait.

148
répondu Jay 2015-05-12 17:48:06

j'ai été informé par de nombreuses personnes qui ont utilisé les deux que leur expérience de programmation était moins douloureuse avec ATL qu'avec MFC. Votre exécutable compilé sera également beaucoup plus petit avec ATL.

je vous recommande prendre un coup d'oeil à WTL , car il s'appuie sur ATL.

Qu'est-ce que c'est que cette "fonctionnalité supplémentaire"? Ai-je besoin?

Si vous définissez votre exigences, Il pourrait être plus facile de répondre si vous pouvez éviter d'utiliser MFC. Malheureusement, "rien de chic" n'est pas assez exclusif. Être inclusif quant aux fonctionnalités que vous avez l'intention d'utiliser pourrait être plus utile (quels contrôles, quels cadres/technologies/bibliothèques existantes vous voulez utiliser, etc).

Mais voici un article qui décrit certaines caractéristiques de MFC qui ne sont pas directement prises en charge par WTL/ATL.

MFC a également évolué au point qu'il prend en charge un grand nombre de fonctionnalités souhaitables, tels que MAPI, prise en charge des autres exigences de logo Windows, sockets, documents (si vous aimez et/ou utilisez ce modèle), et les fichiers de documents composés. WTL a sa part de fonctionnalités cool, mais MFC est le champion des fonctionnalités claires. Les deux environnements prennent en charge les architectures de fenêtres principales encadrées (fenêtre de cadre avec fenêtre de vue séparée), les applications SDI et MDI, les fenêtres divisées, les applications basées sur le dialogue et diverses classes basées sur COM pour la prise en charge COM.

17
répondu Merlyn Morgan-Graham 2011-08-27 02:20:50

ATL est un ensemble de classes destiné à simplifier l'implémentation des objets COM.

vous pouvez l'utiliser sans MFC. À mon travail, nous utilisons L'ATL pour exposer les interfaces COM au code de calcul. Il n'y a aucun GUI impliqué, il est pour nous d'être en mesure d'appeler ce code de calcul de eg. Excel VBA.

regardez certains COM guide/tutorial pour voir ce qu'il résume.

MFC est juste un ensemble de classes GUI wrapper à L'API Win32. Regarder quelques tutoriels de L'API Win32 pour voir ce qu'il abstrait.

8
répondu Alexandre C. 2011-08-27 08:40:46