logo
Contato | Sobre...        
rebarba rebarba

Rodrigo Strauss :: Blog

follow us in feedly

Explicando a sopa de letrinhas da programação C/C++ para Windows: COM

Outros posts dessa mesma série:   Win32     ATL     MFC

COM - sigla para Component Object Model - é um padrão binário de componentes que foi criado para facilitar o uso de objetos entre as diversas linguagens de programação. Sendo uma das tecnologias mais importantes desenvolvidas pela Microsoft, ela é usada em praticamente todas as partes do Windows e em quase todos os produtos da Microsoft.

Os pilares básicos desse tecnologia são o acesso aos objetos a partir de interfaces, uma interface padrão (IUnknown) para controle de referência e acesso às outras interfaces (da qual todas as interfaces criadas devem herdar), e o padrão binário da vtable (tabela com os ponteiros para as funções da interface) para que os objetos feitos em diversas linguagens possam se comunicar entre si. Para um objeto ser chamado de objeto COM, ele só precisa seguir essas premissas. Quando a implementação é em C++, isso que dizer que o objeto deve herdar de IUnknown e implementar seu três métodos:

interface IUnknown
{
    HRESULT QueryInterface(REFIID riid,[out]void **ppvObject);
    ULONG AddRef();
    ULONG Release();
};

No seu uso mais comum, além das premissas que eu já enumerei, é necessário registrar o objeto e o objeto que sabe criá-lo (objeto que implementa a interface IClassFactory). Entre as linguagem compatíveis com COM estão: C, C++, Delphi, VBScript, JScript, Visual Basic 4/5/6, todas as linguagens .NET (C#, VB, etc), PHP, Python, Perl e outras.

O COM serve de base para diversas outras tecnologias criadas pela Microsoft, que veremos mais a frente. As tecnologias baseadas em COM são geralmente nada mais são do que uma lista de interfaces COM que determinam a comunicação entre os diversos componentes (de um modo geral, não necessariamente componentes COM). Para ser um COM, um objeto só precisa implementar a interface IUnknown. Para ser um controle ActiveX (ActiveX é uma das tecnologias baseadas em COM), um objeto precisa implementar IUnknown e mais as interfaces específicas da tecnologia ActiveX. Veja algumas tecnologias que usam COM como base:

  • ActiveX: Usada para criar controles (ActiveX control) que tem interação com o usuário. Seu uso é muito comum no Visual Basic 6 e anteriores.O próprio Internet Explorer nada mais é do que um programa que hospeda o controle ActiveX de renderização de HTML da Microsoft (mshtml.dll).
  • OLE: Object Linking and Embedding é a tecnologia de troca de dados entre aplicativos que sucedeu o DDE. Quando você copia um desenho no CorelDRAW! e cola no Microsoft Word, toda a comunicação entre eles para que isso seja possível é feita usado OLE. Nesse exemplo específico, o Microsoft Word chama um objeto COM/OLE do CorelDRAW! solicitando que ele desenhe o objeto para que o Word possa exibí-lo.
  • Structured Storage: Parte do OLE, permite que um arquivo possa guardar informações de vários programas. Voltando ao nosso exemplo anterior, quando o usuário salva um documento Microsoft Word que contém um gráfico do CorelDRAW!, o Word faz uma chamada para um objeto COM/OLE do CorelDRAW!, que salva o seu desenho dentro do arquivo DOC do Word. Quando o documento é carregado, ocorre o inverso.
  • MMC: O Microsoft Management Console é uma iniciativa da Microsoft de padronização da aparência e funcionamento das ferramentas de gerenciamento do Windows. O Snapins do MMC nada mais são do que objetos COM que implementam as interfaces específicas para se comunicar com o MMC. Para entender melhor, vá em "Start Menu" >> "Run" ("Menu Iniciar" >> "Executar" para alguns), digite "compmgmt.msc". Tudo que você vê aí é implementado em COM.
  • Windows Shell: A API para usar os recursos do Windows Shell (basicamente Windows Explorer) é exportada como objetos COM. Já mostrei antes um exemplo de como mudar a imagem de fundo do desktop usando o objeto COM do ActiveDesktop.
  • Shell Extensions: Quando você instala o WinZip ou WinRAR, eles adicionam ao menu de contexto do Windows Explorer opções para manipulação de arquivos ZIP ou RAR e para compactar arquivos comuns. Quem controla isso são objetos COM chamados pelo Explorer e registrados pelos respectivos aplicativos.
  • Internet Explorer: Todas as barras de ferramentas personalizadas do Internet Explorer (como as feitas pelo Yahoo! e Google) são objetos COM. Na realidade, todas as extensões feitas ao Internet Explorer são objetos COM, seja barra de ferramentas, um Pane (se você usa IE, use o CTRL+H para descobrir o que é um Pane), seja um Browser Helper Objects.
  • Automation: É a possibilidade de controlar um aplicativo usando objetos COM exportados por ele. Entre os aplicativos que suportam automation estão todos do pacote Office (Word, Excel, etc). As extensões para aplicativos feitas em VBA nada mais são do que programas VB(A) que usam esses objetos Automation para controlá-los. Hoje em dia é possível fazer em .NET o que se fazia com o VBA, mas os objetos .NET nada mais fazem do que repassar as chamadas para os objetos COM.
  • DirectX: O DirectX é 100% implementado como objetos COM.
  • Microsoft Office Addins, Extensions: Todos os Addins e extensões para o Office são feitos em COM, inclusive exemplos conhecidos como a intergração do Google Desktop Search e do MSN Desktop Search com o Outlook. Hoje é possível fazê-los em .NET, já que a Microsoft provê objetos .NET que encapsulam os objetos COM do Office (ou seja, no final das contas, é tudo COM).

Além dessas tecnologias que eu detalhei, existem várias outras, como WMI, Scripting, ASP, Windows Media Player e outros.

Eu tinha preparado uma lista de programas Microsoft ou módulos do Windows que usam COM (Windows Explorer, Internet Explorer, Office, Exchange, SQL Server, ISA, Visual Studio, etc, etc, etc). Depois cheguei a conclusão que é mais fácil listar os módulos que não usam COM: o kernel do Windows (que é feito em C, não em C++), o Bloco de Notas e a Calculadora. Alguém conhece mais algum que não use nada de COM?


Em 16/10/2005 16:15, por Rodrigo Strauss


  
 
 
Comentários
Wanderley Caloni Junior | website | e-mail | em 16/10/2005 | #
Eu chutaria o cmd.exe.
Rodrigo Strauss | website | em 31/10/2005 | #
Não entendi direito o que você quis dizer com "SABER O FUNCIONAMENTO DE CADA ARQUIVO DO WINDOWS", mas os programas que acompanham o Windows têm arquivos de help (menu Ajuda >> Índice) que explicam tudo sobre eles.
drauto z. vieira | e-mail | em 19/04/2006 | #
Caro Rodrigo, sou iniciante em C... mas gostaria de fazer uma questão se puderes me ajudar...
penso em executar um programinha em C++ na verdade um gerador de relatório apartir do MS Word a idéia é ter um icone na varra de ferramentas onde o usuário vai informar sobre o trabalho que digitou e o programa salva em um banco de dados e faz uma cópia do trabalho...
Acha que é possível acrescentar tal ícone...
Desde já grato..
Rodrigo Strauss | website | em 19/04/2006 | #
Você consegue fazer isso com uma macro do Word. Procure sobre macros do Word e VBA.
claudio peralta ribeiro | em 10/03/2007 | #
Rodrigo Strauss , gostaria de saber se essas tecnologias como (Active Template Library(ATL) e Microsoft Foundation Classes (MFC) ) sao feitas atraves do pré-processador do C e da Linguagem C pois eu estou querendo fazer a minha propria MFC e a minha propria ATL.

desde já agradeço.
Rodrigo Strauss | website | em 11/03/2007 | #
Essas bibliotecas são C++. MFC usa razoávelmente o pre processador, e a ATL usa bem pouco,.
Juliana Noronha | em 26/07/2007 | #
Tenho uma planilha Excel com vários cálculos simples sendo executados nas células da própria planilha, sendo assim qualquer um pode ver os cálculos, ainda que se coloque senha (existem vários crackers que quebram a senha do Excel) ou venha a fazer a programação em Macro-VBA. Sendo assim, gostaria de colocar esses cálculos em algum programa, em C, C++, C#, que permitisse os cálculos ficarem em caixa preta. Mas não sei como fazer com que o Excel "chame" esse programa, passe os dados contidos na tabela e depois receba a saída do programa e lance o resultado na planilha. Alguma sugestão do que seria melhor nessa situação? E se sim, tem algo que possa me ajudar a fazê-lo?
Desde já obrigada.
Atenciosamente,
Juliana
Algo a dizer?
Nome:


Site:


E-mail:


Escreva o número vinte e seis:


 Não mostre meu e-mail no site, não serve pra nada mesmo...

Comentário





Os comentários devem ser sobre assuntos relativos ao post, eu provavelmente apagarei comentários totalmente offtopic. Se quiser me enviar uma mensagem, use o formulário de contato. E não esqueça: isso é um site pessoal e eu me reservo o direito de apagar qualquer comentário ofensivo ou inapropriado.
rebarba rebarba
  ::::