¿Cuál es la diferencia fundamental entre MFC y ATL?

110

Suponiendo que solo los estoy usando para programas GUI "normales" (sin COM, sin ActiveX, nada sofisticado), ¿cuál es la diferencia fundamental que veré entre ATL y MFC, para ayudarme a descubrir cuál usar?


Hice algunas búsquedas en la web, pero al final ninguna de las respuestas realmente respondió a mi pregunta:

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

    • "ATL es una manera rápida y fácil de crear un componente COM en C ++ y mantener un tamaño reducido. Utilice ATL para crear un control si no necesita todas las funciones integradas que MFC proporciona automáticamente".

      Realmente no responde a mi pregunta, porque:

      • No estoy trabajando con COM.

      • ¿Esto implica que MFC no es rápido? ¿Por qué / cómo?

    • "MFC le permite crear aplicaciones completas, controles ActiveX y documentos activos. Si ya ha creado un control con MFC, es posible que desee continuar con el desarrollo en MFC. Cuando cree un nuevo control, considere usar ATL si no necesita todas las funciones integradas de MFC ".

      Tampoco responde a mi pregunta, porque:

      • Realmente ni siquiera sé qué es ActiveX en primer lugar.

      • Parece que Microsoft está desalentando el uso de MFC, pero no puedo entender por qué.

      • ¿Qué es exactamente la "funcionalidad incorporada" de MFC que ATL no proporciona?

    • En general, esto no responde a mi pregunta porque no explica las desventajas y las razones detrás de ellas.

porque directa o indirectamente, todo parece enlazar a la página anterior:

Lo que he observado actualmente (en los últimos días, mientras intentaba aprender ambos):

  • ATL se basa en plantillas o polimorfismo en tiempo de compilación.
    • Los métodos ATL tienden a ser no virtuales y tienden a devolver referencias.
  • MFC se basa en métodos virtuales o polimorfismo en tiempo de ejecución.
    • Los métodos MFC tienden a ser virtuales y tienden a devolver punteros.

Pero no parece haber ninguna diferencia arquitectónica entre ellos :

  • Ambos usan mapas de mensajes ( BEGIN_MSG_MAPvs. BEGIN_MESSAGE_MAP... gran cosa)
  • Ambos envuelven métodos Win32 en clases
  • Ambos parecen tener clases similares CWndvs.CWindow

Pero entonces, si no hay una diferencia real excepto por el aspecto de tiempo de compilación vs. tiempo de ejecución, entonces ¿por qué existen ambos? ¿No debería ser suficiente uno de ellos?

¿Que me estoy perdiendo aqui?

usuario541686
fuente
3
Podría estar equivocado, pero sé que MFC requiere una DLL de tiempo de ejecución bastante considerable, mientras que creo que ATL se integra todo en un archivo ejecutable. ATL es más ligero en general. Además, echa un vistazo a WTL
Merlyn Morgan-Graham
@Merlyn: Correcto, pero ¿por qué necesita una DLL de tiempo de ejecución considerable? ¿Cuál es la diferencia fundamental que causa esto?
user541686
1
La misma diferencia entre heredar clases precompiladas vinculadas desde una DLL y heredar plantillas vinculadas por inclusión de código fuente / instanciación de plantillas. Las plantillas son generalmente bibliotecas "solo de encabezado". Mi respuesta es incompleta, por lo tanto, en los comentarios :) MFC todavía existe debido a la gran adopción y compatibilidad con versiones anteriores. De lo contrario, MS lo habría descartado cuando crearon envoltorios win32 más nuevos. Suelen tener contratos de soporte prolongados en su software (que varían, pero hasta 10 años). El soporte no es incompatible con la desaprobación, aunque.
Merlyn Morgan-Graham
@Merlyn: Entonces, lo que entiendo es que no debería usar MFC. ¿Cuál es esa "funcionalidad adicional" que siguen mencionando? Lo necesito?
user541686
2
@Merlyn: ¿Has oído hablar de ATL.DLL? ¿Ha oído hablar del término "Usar MFC como biblioteca estática"?
Ajay

Respuestas:

179

Creo que la respuesta a tu pregunta es principalmente histórica, si miras hacia atrás en cómo se originaron y evolucionaron las dos bibliotecas a lo largo del tiempo.

La respuesta corta es, si no está haciendo nada "elegante", use ATL. Es ideal para interfaces de usuario simples con COM incluido.

La respuesta larga: MFC fue construido a principios de los 90 para probar este nuevo lenguaje llamado C ++ y aplicarlo a Windows. Puso funciones similares a las de Office disponibles para la comunidad de desarrolladores cuando el sistema operativo aún no las tenía.

[Editar embellecimiento: no trabajé en Microsoft, así que no sé si Office se creó alguna vez en MFC, pero creo que la respuesta es no. En Win 3.1, Win 95 days, el equipo de interfaz de usuario de Office inventaba nuevos controles, los empaquetaba en bibliotecas, luego los equipos de Windows y MFC incorporarían envoltorios y API a esos controles con dlls redistribuibles. Supongo que hubo un poco de colaboración y código compartido entre esos equipos. Con el tiempo, esos controles pasarían a formar parte del sistema operativo base en los Service Packs o en la próxima versión de Windows. Este patrón continuó con Office Ribbon, que se agregó a Windows como un componente adicional mucho después de que se envió Office, y ahora es parte del sistema operativo Windows.]

En ese momento, la biblioteca era bastante primitiva, tanto porque el lenguaje C ++ y el compilador eran nuevos, como porque Microsoft lo construyó con el tiempo a medida que Office evolucionó.

Debido a esta historia, MFC:

  1. Tiene un diseño bastante tosco. Comenzó como un envoltorio ligero alrededor de la API de Windows, pero creció. Hay un montón de pequeñas 'características' que tuvieron que inventarse porque el compilador y el lenguaje simplemente no las admitían. No había plantillas, inventaron una clase de cadena, inventaron clases de lista, diseñaron su propia identificación de tipo de tiempo de ejecución, etc.
  2. Encapsula 20 años de evolución de Office y Windows, que incluye una gran cantidad de cosas que probablemente nunca usará: interfaces de documentos únicos y múltiples, DDE, COM, COM +, DCOM, vinculación e incrustación de documentos (para que pueda incrustar un documento de Word en su aplicación si lo desea), controles ActiveX (¡evolución de la incrustación de objetos para la web!), Almacenamiento de documentos estructurados, serialización y control de versiones, automatización (desde los primeros años de VBA) y, por supuesto, MVC. Las últimas versiones son compatibles con el acoplamiento de ventanas de estilo Visual Studio y la cinta de Office. Básicamente, todas las tecnologías de Redmond en 20 años están ahí en alguna parte. ¡Es ENORME!
  3. Tiene un montón de pequeñas trampas, errores, soluciones, suposiciones, soporte para cosas que todavía están ahí y que nunca usarás y que causan problemas. Debe estar íntimamente familiarizado con la implementación de muchas clases y cómo interactúan para usarlo en un proyecto de tamaño decente. Es común profundizar en el código fuente de MFC durante la depuración. Aún ocurre encontrar una nota técnica de 15 años en que algún puntero es nulo y causa un bloqueo. Las suposiciones sobre la inicialización de elementos de incrustación de documentos antiguos pueden afectar su aplicación de maneras extrañas. No existe tal cosa como la abstracción en MFC, necesita trabajar con sus peculiaridades y aspectos internos a diario, no oculta nada. Y no me hagas empezar con el asistente de clases.

ATL se inventó a medida que evolucionó el lenguaje C ++ y llegaron las plantillas. ATL fue una muestra de cómo usar plantillas para evitar los problemas de tiempo de ejecución de la biblioteca MFC:

  1. Mapas de mensajes: dado que se basan en plantillas, los tipos se verifican y, si estropea la función enlazada, no se compila. En MFC, los mapas de mensajes se basan en macros y están sujetos al tiempo de ejecución. Esto puede causar errores extraños, mensaje enrutado a la ventana incorrecta, un bloqueo si tiene una función o macro definida incorrectamente, o simplemente no funciona porque algo no está bien conectado. Mucho más difícil de depurar y más fácil de romper sin darse cuenta.
  2. COM / Automatización: similar a los mapas de mensajes, COM originalmente se limitaba al tiempo de ejecución mediante macros, lo que requería una gran cantidad de manejo de errores y causaba problemas extraños. ATL lo hizo basado en plantillas, compilado con límite de tiempo y mucho, mucho más fácil de manejar.

[Editar embellecimiento: en el momento en que se creó ATL, la hoja de ruta técnica de Microsoft se centró principalmente en la "Gestión de documentos". Apple los estaba matando en el negocio de la autoedición. La 'vinculación e incrustación de documentos' de Office fue un componente principal para mejorar las características de 'Gestión de documentos' de Office para competir en este espacio. COM fue una tecnología central inventada para la integración de aplicaciones, y las API de incrustación de documentos se basaron en COM. MFC fue difícil de usar para este caso de uso. ATL fue una buena solución para hacer que esta tecnología en particular sea más fácil para que terceros implementen COM y utilicen funciones de incrustación de documentos.]

Estas pequeñas mejoras hacen que ATL sea mucho más fácil de manejar en una aplicación simple que no necesita todas las características de oficina de MFC. Algo con una interfaz de usuario simple y algo de automatización de Office. Es pequeño, rápido, tiene un tiempo de compilación limitado, lo que le ahorra mucho tiempo y dolor de cabeza. MFC tiene una enorme biblioteca de clases con las que puede resultar complicado trabajar.

Desafortunadamente, ATL se estancó. Tenía envoltorios para la API de Windows y el soporte COM, y nunca fue más allá de eso. Cuando despegó la Web, todas estas cosas se olvidaron como viejas noticias.

[Editar Embellecimiento: Microsoft se dio cuenta de que esta 'cosa de Internet' iba a ser grande. Su hoja de ruta técnica cambió drásticamente para centrarse en Internet Explorer, Windows Server, IIS, ASP, SQL Server, COM / DCOM en Distributed Transaction Server. Así que la vinculación e incrustación de documentos ya no era una prioridad alta.

La enorme huella de MFC hizo que fuera imposible que volcaran, por lo que aún evoluciona lentamente. Las plantillas se han incorporado nuevamente a la biblioteca, así como otras mejoras de lenguaje y API. (No había oído hablar de WTL hasta que vi esta pregunta. :)

En última instancia, cuál usar es simplemente una cuestión de preferencia. La mayoría de las funciones que necesita se encuentran en la API del sistema operativo base, a la que puede llamar directamente desde cualquiera de las bibliotecas, si no hay un contenedor adecuado en la biblioteca.

Solo mis 2 centavos basados ​​en el uso de MFC durante muchos años, y lo uso ahora a diario. Incurrí en ATL cuando se lanzó por primera vez en algunos proyectos durante un par de años. Fue un soplo de aire fresco en esos días, pero nunca llegó a ninguna parte. Y luego apareció la Web y me olvidé de ella.


Editar: esta respuesta tiene una longevidad sorprendente. Como sigue apareciendo en mi página de desbordamiento de pila, pensé en agregar un poco de adorno a la respuesta original que pensé que faltaba.

Arrendajo
fuente
39
+1 Desearía poder +10 esto. Gracias por la excelente descripción de la historia, ¡está muy bien escrita e informativa! :)
user541686
3
Solo quería mencionar ... Usé MFC durante unos días, luego cambié a ATL / WTL, que he estado usando por un tiempo. Y es increíblemente asombroso. Probablemente nunca volveré a mirar a MFC.
user541686
1
Entonces, ¿Microsoft crea nuevos programas usando ambos o ha decidido usar uno sobre el otro?
The Muffin Man
1
Pensé que sabía la diferencia ... pero nunca había visto una explicación tan hermosa y elaborada ... Pulgares
arriba
1
La mejor respuesta que he leído sobre este tema; deberías hacer un artículo con él, incluido WTL
Pat
20

Muchas personas que han usado ambos me han dicho que su experiencia de programación fue menos dolorosa con ATL que con MFC. Su ejecutable compilado también será mucho más pequeño con ATL.

Te recomiendo que eches un vistazo a WTL , ya que se basa en ATL.

¿Cuál es esa "funcionalidad adicional" que siguen mencionando? Lo necesito?

Si define sus requisitos, podría ser más fácil responder si puede evitar el uso de MFC. Desafortunadamente, "nada lujoso" no es lo suficientemente exclusivo. Ser inclusivo en cuanto a las funciones que pretende utilizar podría ser más útil (qué controles, qué marcos / tecnologías / bibliotecas existentes desea utilizar, etc.).

Pero aquí hay un artículo que describe algunas funciones de MFC que no son compatibles directamente con WTL / ATL.

MFC también ha evolucionado hasta el punto de que admite una gran cantidad de características deseables, como MAPI, compatibilidad con otros requisitos del logotipo de Windows, sockets, documentos (si lo desea y / o usa ese patrón) y archivos de documentos compuestos. WTL tiene su parte de características interesantes, pero MFC es el claro campeón de características. Ambos entornos admiten arquitecturas de ventana principal enmarcadas (ventana de marco con ventana de vista separada), aplicaciones SDI y MDI, ventanas divididas, aplicaciones basadas en diálogos y varias clases basadas en COM para soporte COM.

Merlyn Morgan-Graham
fuente
3
La respuesta de Jay tiene este ritmo. Dejando esto para el enlace al artículo que explica algunas de las diferencias.
Merlyn Morgan-Graham
9

ATL es un conjunto de clases destinadas a simplificar la implementación de objetos COM.

Puede usarlo sin MFC. En mi trabajo, utilizamos ATL para exponer interfaces COM al código computacional. No hay GUI involucrado, es para nosotros poder llamar a este código computacional desde, por ejemplo. Excel VBA.

Mire alguna guía / tutorial COM para ver qué resume.

MFC es solo un conjunto de clases contenedoras de GUI para la API de Win32. Mire algún tutorial de la API de Win32 para ver qué abstrae.

Alexandre C.
fuente
ATL también se puede utilizar sin ningún COM involucrado. Muchas clases en él no tienen relación con COM, lo que se vuelve aún más pronunciado cuando se mira WTL.
0xC0000022L
1
@ 0xC0000022L: No estaba al tanto de CWindowImplmis amigos cuando escribí esto. Ahora que tengo más experiencia con ATL, podría intentar reescribir esta respuesta. En particular, ATL / WTL puede reemplazar virtualmente a todos los MFC.
Alexandre C.