Supondo que eu os esteja usando apenas para programas GUI "normais" (sem COM, sem ActiveX, nada extravagante), qual é a diferença fundamental que verei entre ATL e MFC, para me ajudar a descobrir qual usar?
Eu fiz algumas pesquisas na web, mas no final das contas nenhuma das respostas realmente respondeu minha pergunta:
http://msdn.microsoft.com/en-us/library/bk8ytxz5(v=vs.80).aspx :
"ATL é uma maneira rápida e fácil de criar um componente COM em C ++ e manter uma pequena área ocupada. Use ATL para criar um controle se você não precisar de todas as funcionalidades internas que o MFC fornece automaticamente."
Realmente não responde minha pergunta, porque:
Não estou trabalhando com COM.
Isso significa que o MFC não é rápido? Porque como?
"O MFC permite criar aplicativos completos, controles ActiveX e documentos ativos. Se você já criou um controle com o MFC, talvez queira continuar o desenvolvimento no MFC. Ao criar um novo controle, considere usar ATL se não precisar todas as funcionalidades internas do MFC. "
Também não responde à minha pergunta, porque:
Eu nem mesmo sei o que é ActiveX em primeiro lugar.
Parece que a Microsoft está desencorajando o uso do MFC, mas não consigo descobrir por quê.
O que exatamente é a "funcionalidade interna" do MFC que o ATL não oferece?
Em geral, isso não responde à minha pergunta porque não explica as desvantagens e as razões por trás delas.
porque direta ou indiretamente, tudo parece estar vinculado à página anterior:
Como decido se devo usar ATL, MFC, Win32 ou CLR para um novo projeto C ++?
"ATL & MFC são um pouco mais complicado para decidir entre os dois. [[Sem brincadeira!]] Eu encaminhá-lo para a página do MSDN para a escolha, a fim de decidir entre eles."
Obviamente , isso não responde à minha pergunta. :)
http://www.codeguru.com/forum/archive/index.php/t-64778.html
etc.
O que tenho observado atualmente (nos últimos dias, enquanto tento aprender ambos):
- ATL é baseado em modelos ou polimorfismo de tempo de compilação.
- Os métodos ATL tendem a ser não virtuais e tendem a retornar referências.
- MFC é baseado em métodos virtuais ou polimorfismo de tempo de execução.
- Métodos MFC tendem a ser virtuais e tendem a retornar ponteiros.
Mas não parece haver nenhuma diferença arquitetônica entre eles :
- Ambos usam mapas de mensagens (
BEGIN_MSG_MAP
vs.BEGIN_MESSAGE_MAP
... grande coisa) - Ambos envolvem métodos Win32 em classes
- Ambos parecem ter classes semelhantes
CWnd
vs.CWindow
Mas então, se não há diferença real, exceto para o aspecto do tempo de compilação vs. tempo de execução, então por que ambos existem? Não deveria um deles ser suficiente?
O que estou perdendo aqui?
fonte
Respostas:
Acho que a resposta à sua pergunta é principalmente histórica, se você olhar para trás e ver como as duas bibliotecas se originaram e evoluíram ao longo do tempo.
A resposta curta é, se você não está fazendo nada "extravagante", use ATL. É ótimo para interfaces de usuário simples com COM incluído.
A longa resposta: o MFC foi criado no início dos anos 90 para testar essa nova linguagem chamada C ++ e aplicá-la ao Windows. Ele disponibilizou recursos semelhantes aos do Office para a comunidade de desenvolvimento quando o sistema operacional ainda não os tinha.
[Editar enfeite: eu não trabalhei na Microsoft, então não sei se o Office já foi construído no MFC, mas acho que a resposta é não. De volta ao Win 3.1, Win 95 dias, a equipe de IU do Office inventaria novos controles, empacotaria-os em bibliotecas e, em seguida, as equipes do Windows e MFC incorporariam wrappers e API a esses controles com dlls redistribuíveis. Eu acho que houve um pouco de colaboração e compartilhamento de código entre essas equipes. Eventualmente, esses controles chegariam ao sistema operacional de base em service packs ou na próxima versão do Windows. Esse padrão continuou com a Faixa de Opções do Office, que foi adicionada ao Windows como um componente complementar bem depois do lançamento do Office e agora faz parte do sistema operacional Windows.]
Naquela época, a biblioteca era bastante primitiva, tanto por causa da linguagem C ++ e do compilador serem novos, quanto pela Microsoft construí-la ao longo do tempo conforme o Office evoluía.
Por causa dessa história, MFC:
ATL foi inventado com a evolução da linguagem C ++ e os modelos chegaram. ATL foi uma demonstração de como usar modelos para evitar os problemas de tempo de execução da biblioteca MFC:
[Editar enfeite: na época em que o ATL foi criado, o roteiro técnico da Microsoft estava focado principalmente em 'Gerenciamento de documentos'. A Apple os estava matando no mercado de editoração eletrônica. A 'vinculação e incorporação de documentos' do Office foi um componente principal para aprimorar os recursos de 'Gerenciamento de documentos' do Office para competir neste espaço. COM foi uma tecnologia central inventada para integração de aplicativos, e as APIs de incorporação de documentos foram baseadas em COM. O MFC era difícil de usar neste caso de uso. ATL foi uma boa solução para tornar esta tecnologia específica mais fácil para terceiros implementarem COM e utilizarem recursos de incorporação de documentos.]
Essas pequenas melhorias tornam o ATL extremamente mais fácil de lidar em um aplicativo simples que não precisa de todos os recursos do Office like do MFC. Algo com uma interface de usuário simples e alguma automação de escritório incluída. É pequeno, é rápido e tem limite de tempo de compilação economizando muito tempo e dor de cabeça. O MFC tem uma enorme biblioteca de classes que podem ser desajeitadas e difíceis de trabalhar.
Infelizmente, o ATL estagnou. Ele tinha wrappers para a API do Windows e suporte COM, mas nunca foi além disso. Quando a Web decolou, todas essas coisas foram meio que esquecidas como notícias antigas.
[Editar enfeite: a Microsoft percebeu que essa 'Coisa da Internet' seria grande. Seu roteiro técnico mudou drasticamente para se concentrar no Internet Explorer, Windows Server, IIS, ASP, SQL Server, COM / DCOM no Distributed Transaction Server. Portanto, a vinculação e incorporação de documentos não era mais uma prioridade alta.]
A grande pegada do MFC tornou impossível para eles fazerem o dump, então ele ainda evolui lentamente. Os modelos foram incorporados de volta à biblioteca, bem como outros aprimoramentos de linguagem e API. (Eu não tinha ouvido falar do WTL até ver esta pergunta. :)
No final das contas, qual deles usar é simplesmente uma questão de preferência. A maioria dos recursos de que você precisa está na API do sistema operacional base, que pode ser chamada diretamente de qualquer uma das bibliotecas, se não houver um wrapper adequado na biblioteca.
Apenas meus 2 centavos com base no uso do MFC por muitos anos, e agora o uso diariamente. Eu me interessei pelo ATL quando ele foi lançado pela primeira vez em alguns projetos por alguns anos. Era uma lufada de ar fresco naquela época, mas nunca foi realmente a lugar nenhum. E então a Web apareceu e eu esqueci completamente dela.
Edit: Esta resposta tem uma longevidade surpreendente. Como ele continua aparecendo em minha página de estouro de pilha, pensei em adicionar um pouco de enfeite à resposta original que achei que estava faltando.
fonte
Muitas pessoas que usaram os dois me disseram que sua experiência de programação foi menos dolorosa com ATL do que com MFC. Seu executável compilado também será muito menor com ATL.
Recomendo que você dê uma olhada no WTL , pois ele se baseia no ATL.
Se você definir seus requisitos, pode ser mais fácil responder se você puder evitar o uso do MFC. Infelizmente, "nada sofisticado" não é exclusivo o suficiente. Incluir quais recursos você pretende usar pode ser mais útil (quais controles, quais estruturas / tecnologias / bibliotecas existentes você deseja usar, etc).
Mas aqui está um artigo que descreve alguns recursos do MFC que não são diretamente suportados pelo WTL / ATL.
fonte
ATL é um conjunto de classes destinadas a simplificar a implementação de objetos COM.
Você pode usá-lo sem MFC. No meu trabalho, usamos ATL para expor interfaces COM ao código computacional. Não há GUI envolvida, cabe a nós sermos capazes de chamar este código computacional de, por exemplo. Excel VBA.
Veja algum guia / tutorial COM para ver o que ele resume.
MFC é apenas um conjunto de classes de wrapper GUI para a API Win32. Dê uma olhada em algum tutorial da API Win32 para ver o que ele abstrai.
fonte
CWindowImpl
e amigos quando escrevi isso. Agora que tenho mais experiência com ATL, poderia tentar reescrever esta resposta. Em particular, ATL / WTL pode substituir virtualmente todo o MFC.