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:
¿Cómo decido si utilizar ATL, MFC, Win32 o CLR para un nuevo proyecto de C ++?
"ATL y MFC son algo más difíciles de decidir entre ellos. [[¡No es broma!]]. Lo recomendaría a la página de MSDN para elegir y decidir entre ellos".
Obviamente , esto no responde a mi pregunta. :)
http://www.codeguru.com/forum/archive/index.php/t-64778.html
etc.
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_MAP
vs.BEGIN_MESSAGE_MAP
... gran cosa) - Ambos envuelven métodos Win32 en clases
- Ambos parecen tener clases similares
CWnd
vs.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?
fuente
Respuestas:
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:
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:
[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.
fuente
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.
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.
fuente
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.
fuente
CWindowImpl
mis 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.