Ir para o conteudo

Component Object Model

Origem: Wikipedia, a enciclopedia livre.

Component Object Model (COM) e uma plataforma da Microsoft para componentes de software lancada em 1993. Ela e usada para permitir a comunicacao entre processos e a criacao dinamica de objetos em qualquer linguagem de programacao que suporte a tecnologia. O termo COM e frequentemente usado no desenvolvimento de software para se referir a um grupo de tecnologias que incluem OLE, OLE Automation, ActiveX, COM+ e DCOM. Apesar de introduzido em 1993, a Microsoft nao iniciou a divulgacao ampla do nome antes de 1997.

Em sua essencia, a COM e uma forma independente de linguagem de programacao de implementar objetos de forma que eles possam ser utilizados em diferentes ambientes dos quais foram criados, mesmo entre diferentes maquinas e arquiteturas. A COM permite a reutilizacao de objetos sem o conhecimento de sua implementacao interna pois forca o desenvolvedor a fornecer uma interface bem definida, que esta separada da implementacao. As diferentes semanticas na alocacao de memoria entre linguagens de programacao sao resolvidas ao tornar os objetos responsaveis por sua propria criacao e destruicao, atraves de contagem de referencia. A conversao entre diferentes interfaces de um objeto sao obtidas atraves da funcao QueryInterface(). O metodo preferivel de herdar em COM e a criacao de sub-objetos (chamada agregacao) para as chamadas de metodo, os quais sao delegados.

Apesar de ter sido implementado em diversas plataformas, a COM e usada em sua maioria no Microsoft Windows. Espera-se que ela seja substituida ou pelo menos estendida pela plataforma Microsoft .NET, suportando entao Web Services atraves da Windows Communication Foundation (WCF). A DCOM em redes utiliza formatos binarios proprietarios, enquanto a WCF utiliza troca de mensagem SOAP baseada em XML. COM tambem compete com CORBA e Enterprise JavaBeans como um sistema para componentes de software.

Historia

[editar | editar codigo]

Um dos primeiros metodos de comunicacao entre processos no Windows foi o DDE, que permitia o envio e recepcao de mensagens na chamada "conversacao" entre aplicacoes. Essa tecnologia foi a base da OLE, que era uma das tecnologias mais inovadoras introduzidas no Windows 3.0. Conversacoes por texto e do Windows nao se mostraram tao flexiveis para permitir o compartilhamento de funcionalidades de aplicacoes de uma maneira extensivel. Entao, para o lancamento da versao 3.1 do Windows, foi criada a COM como um novo fundamento do sistema, e a OLE foi alterada para a OLE2.

O Visual Basic introduziu o VBX (extensoes empacotadas na forma de DLL) que permitia a criacao de objetos a serem posicionados graficamente em um formulario e manipulados atraves de propriedades e metodos. Isso foi adaptado posteriormente para outras linguagens, assim como foi feito no Visual C++. Os controles COM (OCX) tornaram-se um substituto do VBX.

Anthony Williams, um dos mais notaveis pensadores na criacao da arquitetura COM, distribuiu alguns artigos internos da Microsoft em pro dos componentes de software: Object Architecture: Dealing With the Unknown - or - Type Safety in a Dynamically Extensible Class Library (1988) e On Inheritance: What It Means and How To Use It (1990). Varias dessas ideias resultaram na primeira arquitetura orientada a objeto da empresa, OLE. A OLE foi construida sobre a DDE e desenvolvida especificamente para documentos compostos. Ela foi introduzida no Microsoft Word e no Microsoft Excel em 1991, e depois incluida no Windows, a comecar na versao 3.1 de 1992. Uma exemplo de um documento composto e uma planilha eletronica embarcada em um documento de texto do Word: caso sejam feitas mudancas na mesma planilha aberta no Excel, ela sao atualizadas automaticamente no documento do Word.

Em 1991 a Microsoft introduziu o Visual Basic Extension (VBX) no Visual Basic 1.0. Em 1993 a empresa lancou a OLE 2. Enquanto a primeira versao era focada em documentos compostos, tanto COM quanto OLE 2 foram desenvolvidas para componentes de software em geral. Em 1994 os controles OLE (OCX) foram introduzidos como sucessores dos controles VBX. Na mesma epoca a empresa declarou que a OLE 2 seria conhecida somente como OLE.

No inicio de 1996 a Microsoft encontrou novo uso para os controles personalizados OLE, expandido o navegador Internet Explorer para apresentar o conteudo, renomeando algumas partes da OLE relacionadas ao ActiveX, e gradualmente renomeando todas as tecnologias OLE para ActiveX, exceto a tecnologia de documentos compostos que estava em uso no Microsoft Office. No mesmo ano a DCOM foi introduzida como uma resposta a CORBA.

Tecnologias relacionadas

[editar | editar codigo]

COM foi uma plataforma bastante influente no desenvolvimento de software do Windows, por isso influenciou o desenvolvimento de varias tecnologias de suporte.

Para fornecer aos desenvolvedores suporte a transacoes distribuidas, e melhor gerenciamento de memoria e processamento, assim como para posicionar o Windows como uma alternativa a outros sistemas operacionais corporativos, a Microsoft introduziu a tecnologia Microsoft Transaction Server no Windows NT Service Pack 4.

No Windows 2000, tal extensao significativa a COM foi incorporada ao sistema operacional e renomeada COM+. Na mesma epoca a DCOM foi reconsiderada como uma entidade separada.

Ver artigo principal: DCOM
Ver artigo principal: Microsoft .NET

A plataforma COM foi substituida pela Microsoft .NET (le-se "dot NET"), com a Microsoft focando seu marketing exclusivamente a essa nova plataforma. A COM era geralmente usada para interoperar codigos complexos e de grande desempenho com interfaces ao usuario em Visual Basic ou ASP.

Para algumas extensoes a COM agora foi depreciada em favor da .NET. Ja que a .NET fornece ferramentas de desenvolvimento rapido similares ao Visual Basic tanto para Windows Forms quanto para Web Forms com JIT, o codigo de alto desempenho pode ser implementado em C#.

Apesar disso, a COM permanece como uma tecnologia viavel com importante base de sistema legado. Por exemplo, a SDK, popular renderizador do DirectX 3D, e baseado em COM. A COM tambem e ideal para o controle de scripts de aplicacoes como o Office ou o Internet Explorer, pois fornece uma interface para chamar metodos de objetos COM de um script ao inves de necessitar o conhecimento de uma API em tempo de compilacao.

Varios servicos fornecidos pela COM+ ainda sao importantes em aplicacoes .NET corporativas, tais como transacoes e filas de componentes.

Seguranca da Internet

[editar | editar codigo]

A ideia da Microsoft de embarcar conteudo ativo em paginas web como componentes COM/ActiveX (ao inves de, por exemplo, applets Java) criou uma combinacao de problemas no Internet Explorer, que lideraram a uma explosao de infeccoes por virus de computador, trojan e spyware. A empresa reconheceu o problema com o ActiveX ainda em 1996 quando Charles Fitzgerald, gerente de programas do time de Java da Microsoft disse que "Se voce quer seguranca na Internet, desligue seu computador. ... Nos nunca declaramos que o ActiveX e intrinsecamente seguro."[1] Como os componentes COM e ActiveX sao executados como codigo nativo na maquina hospedeira, existem algumas pequenas restricoes que o codigo pode fazer. Varios desses problemas foram rediscutidos pela introducao da "assinatura de codigo" (baseada em assinatura digital) e tambem na plataforma .NET.

Detalhes tecnicos

[editar | editar codigo]

Programadores COM constroem software usando componentes compativeis com a COM. Diferentes tipos de componentes sao identificados por identificadores de classe (CLSIDs), que sao identificadores globais unicos (GUID). Cada componente COM expoe sua funcionalidade atraves de uma ou mais interfaces. As diferentes interfaces suportadas por um componente sao distinguidas umas das outras atraves de identificadores de interface (IID), que tambem sao GUID.

Interfaces COM possuem implementacoes em diversas linguagens, como C, C++, Visual Basic e diversas linguagens interpretadas da plataforma Windows. Todo acesso aos componentes e feito atraves de metodos das interfaces. Isso permite tecnicas como programacao entre processos, ate mesmo entre computadores, este ultimo utilizando DCOM.

Interfaces

[editar | editar codigo]

Todos os componentes COM devem implementar pelo menos a interface padrao IUnknown, e, portanto, todas as interfaces COM sao derivadas de IUnknown. Essa interface consiste de tres metodos: AddRef() e Release(), que implementam a contagem de referencias e o controle do tempo de vida das interfaces; e QueryInterface(), que ao especificar um IID permite ao invocador obter referencias as diferentes interfaces que o componentes implementa. O efeito de QueryInterface() e similar ao dynamic_cast<> em C++ ou conversoes de tipo em Java e C#.

As interfaces de componentes COM sao necessarias para exibir as propriedades reflexivas, simetricas e transitivas. A propriedade reflexiva refere-se a habilidade da chamada QueryInterface() de uma dada interface de retornar uma mesma instancia da interface. A propriedade simetrica exige que quanto uma interface B e obtida de uma interface A via QueryInterface(), a interface A tambem possa ser obtida da interface B da mesma forma. A propriedade transitiva e similar a simetrica, mas requer que se a interface B pode ser obtida da interface A e a interface C pode ser obtida da interface B, entao a interface C deve poder ser obtida da interface A.

Uma interface consiste de um ponteiro para uma tabela de funcoes virtuais que contem uma lista de ponteiros para as funcoes que implementam as funcoes declaradas na interface, na mesma ordem que foram declaradas. Essa tecnica de passagem de estruturas de ponteiros de funcao e bastante similar a usada pelo OLE 1.0 para comunicar com suas bibliotecas de sistema.

A COM especifica varias outras interfaces padrao usadas para permitir a comunicacao entre componentes. Por exemplo, uma interface dessas e a IStream, que e exposta por componentes que possuem semanticas de fluxos de dados (como o componente FileStream, usado para ler e escrever arquivos). Ela possui os metodos esperados Read e Write para realizar a leitura e escrita de fluxos de dados.

Uma classe em COM e denominada coclasse, e permite definir uma classe (no sentido de orientacao a objeto) independentemente de linguagem. Ela fornece uma implementacao concreta de uma ou mais interfaces. Tais implementacoes concretas podem ser escritas em qualquer linguagem de programacao que suporte o desenvolvimento de componentes COM. Uma das maiores contribuicoes da COM para o mundo de desenvolvimento para a plataforma Windows foi a filosofia da separacao do conceito de interface e implementacao, o que influenciou a maneira como varios programadores constroem sistemas atualmente. Uma extensao desse conceito e a nocao de uma interface e multiplas implementacoes. Isso significa que, em tempo de execucao, uma aplicacao pode escolher instancializar uma interface entre varias implementacoes disponiveis.

IDL e bibliotecas de tipos

[editar | editar codigo]

Como mencionado anteriormente, as bibliotecas de tipos contem metadados que representam os tipos COM. Entretanto, esses tipos devem antes serem descritos atraves da Microsoft Interface Definition Language. Inclusive, e uma pratica comum no desenvolvimento de um componente COM iniciar com as definicoes dos tipos usando IDL.

Um arquivo IDL permite que desenvolvedores definam classes orientadas a objeto, interfaces, estruturas, enumeracoes e outros tipos definidos pelo utilizador, independentemente da linguagem de programacao. A IDL e bastante similar em aparencia as declaracoes em C e C++ com a adicao das palavras-chave interface e library para a definicao de interfaces e colecoes de classes, respectivamente.

O arquivo IDL e compilado pelo compilador MIDL em um par de formularios para consumo em diversas linguagens. Para C e C++, o compilador MIDL gera um arquivo de cabecalho (.h) contendo definicoes de estruturas para combinar as tabelas de metodos virtuais das interfaces declaradas e um arquivo de codigo (.c ou .cpp) contendo declaracoes das GUID. Pode-se tambem gerar codigo fonte C++ para um modulo de proxy, que contem esbocos de metodos para converter chamadas COM em chamadas de procedimento remoto, habilitando entao a DCOM.

Um arquivo IDL tambem pode ser compilado pelo compilador MIDL em uma biblioteca de tipos (.tlb). Os metadados binarios contidos na biblioteca de tipos devem ser processados por compiladores de linguagens e ambientes em tempo de execucao (como Visual Basic, Delphi, CLR da .NET).

COM como uma plataforma de objetos

[editar | editar codigo]

Os principios fundamentais da COM possuem suas raizes na filosofia da orientacao a objeto. Ela e uma plataforma para o desenvolvimento e implantacao de orientacao a objeto. Como a plataforma e manipulada em tempo de execucao, os tipos devem ser identificaveis e especificaveis individualmente em tempo de execucao. Para obter esse resultado sao usados os GUID, que sao identificadores unicos globais. Cada tipo COM tem designado seu proprio GUID para identificacao em tempo de execucao.

Para que tal informacoes seja acessivel tanto em tempo de compilacao quanto em tempo de execucao, a COM apresenta a biblioteca de tipos; e atraves de seu uso que a plataforma desempenha seu papel na interacao dinamica de objetos. Considerando a seguinte definicao de uma coclasse em um arquivo IDL:

coclass MyObject
{
[default] interface IMyObject;
[default, source] dispinterface _IMyObjectEvents;
};

O fragmento de codigo acima declara uma classe COM MyObject que deve implementar uma interface IMyObject e que suporta (mas nao implementa) a interface de evento _IMyObjectEvents. Ignorando a interface de evento por um momento, isso e conceitualmente equivalente a definicao de uma classe C++ como segue:

class CSomeObject : public ISomeInterface
{
...
...
...
};

no qual ISomeInterface e uma classe virtual C++.

Referindo-se novamente a classe COM: uma vez que a definicao de uma coclasse e formalizada em IDL, e uma biblioteca de tipo e compilada atraves do arquivo IDL, o onus esta no compilador da linguagem de programacao em ler e interpretar apropriadamente a biblioteca de tipos e produzir codigo necessario para o desenvolvedor implementar o codigo necessario para a coclasse COM.

Apos a implementacao de uma coclasse COM ser construida e disponibilizada no sistema, a proxima questao e instancia-la. Em linguagens como C++ isso pode ser feito pela API CoCreateInstance(). Chamar essa API da seguinte maneira:

CoCreateInstance
(
CLSID_MyObject,
NULL,
CLSCTX_INPROC_SERVER,
IID_IMyObject,
(void**)&m_pIMyObject
);

e conceitualmente equivalente em C++ ao seguinte codigo:

ISomeInterface* pISomeInterface = new CSomeObject();

No primeiro caso, e pedido ao sub-sistema COM um ponteiro para um objeto que implementa a interface IMyObject e cuja implementacao e CLSID_MyObject. No segundo caso, e pedido a criacao instancializacao de uma classe C++ que implementa a interface ISomeInterface cuja implementacao e CSomeObject.

Conclui-se que uma coclasse e uma classe orientada a objeto no mundo da COM.

Registro

[editar | editar codigo]

No Windows, as classes COM, interfaces e bibliotecas de tipos sao listadas pelo GUID no Registro do Sistema sob HKEY_CLASSES_ROOT\CLSID para classes e HKEY_CLASSES_ROOT\interface para interfaces. As bibliotecas COM usam o registro para localizar ou o local correto de bibliotecas locais ou a localizacao na rede de servicos remotos.

Contagem de referencia

[editar | editar codigo]

A interface mais fundamental da COM, IUnknown (da qual todas as interfaces COM devem derivar), suporta dois conceitos principais: a exploracao das funcionalidades atraves do metodo QueryInterface e o gerenciamento do tempo de vida do objeto atraves de AddRef() e Release(). A contagem de referencias e a exploracao de funcionalidades sao aplicadas aos objetos, e portanto devem ter implementacao centralizada.

As especificacoes COM requerem uma tecnica chamada contagem de referencias para assegurar que objetos individuais permanecam na memoria enquanto existam clientes que possuem acesso a pelo menos uma de suas interfaces e, da mesma forma, que o mesmo objeto seja destruido quando seu uso ja nao e mais necessario. Um objeto COM e responsavel pela liberacao de sua propria memoria uma vez que a contagem de referencia chega a zero.

Para essa implementacao, um objeto COM geralmente mantem uma valor inteiro usado para a contagem de referencias. Quando AddRef() e invocado por qualquer uma das interfaces do objeto, esse valor e incrementado. Da mesma forma, quando Release() e invocado, esse valor e decrementado.

Algumas linguagens (como o Visual Basic) fornecem uma contagem automatica de referencias de forma que os desenvolvedores COM nao precisem manter explicitamente qualquer referencia interna no codigo fonte. Em C, a contagem explicita de referencias deve ser feita. Em C++ pode-se escolher entre a contagem explicita de referencias ou o uso de ponteiros inteligentes (tambem chamados smart pointers, ponteiros automaticos que gerenciam automaticamente a contagem de referencias).

Para facilitar e promover o desenvolvimento COM, a Microsoft introduziu a biblioteca de rotinas ATL para desenvolvedores C++. Ela fornece um paradigma de alto nivel para o desenvolvimento na plataforma, e tambem protege desenvolvedores de aplicacoes da necessidade de manutencao de contagem de referencias. Outras bibliotecas e linguagens compativeis com a COM incluem Microsoft Foundation Classes, VBScript, Visual Basic, ECMAScript (JavaScript) e Delphi.

Instancializacao

[editar | editar codigo]

A COM padroniza o processo de criacao de objetos COM ao requerer o uso de factories (construtores) de classes. Para a criacao de um objeto COM deve existir uma factory e um identificador. A classe factory e tambem um objeto COM, que deve expor ou a interface IClassFactory ou a interface IClassFactory2.

Um objeto da classe factory e geralmente contido no mesmo codigo executavel do objeto COM. Quando ele e chamado para a criacao de um objeto, o identificador deve ser fornecido, de forma a indicar qual classe deve ser criada. Isso porque uma classe factory pode criar objetos de mais de uma classe, o que e transparente ao sistema COM.

Ao delegar a responsabilidade de criacao de objeto em outro objeto, e promovido um grande nivel de abstracao, dando ao desenvolvedor mais flexibilidade, e separando a aplicacao cliente do objeto COM.

Reflexao

[editar | editar codigo]

Na epoca de lancamento das tecnologias COM, a unica maneira de um cliente encontrar as funcionalidades de um objeto era somente ao instancia-lo e posteriormente atraves de QueryInterface(). Essa forma de exploracao tornou-se inadequada para varias aplicacoes, incluindo a selecao dos componentes apropriados para uma tarefa especifica e ferramentas para ajudar os desenvolvedores a entender como usar os metodos fornecidos por um objeto.

Como resultado, as bibliotecas de tipos COM foram introduzidas, atraves das quais os componentes de descrevem. Uma biblioteca de tipo contem informacoes como o identificador da classe do componente, os identificadores das interfaces que o componente implementa e a descricao de cada um dos metodos das interfaces.

Criticas

[editar | editar codigo]

Processamento de mensagens

[editar | editar codigo]

Quando a COM e inicializada ela cria uma janela invisivel que e usada para o roteamento de mensagens entre processos e threads. Essa janela deve ter sua fila de mensagens regularmente processada. Em versoes antigas do Windows, uma falha em tal sistema poderia causar um travamento geral de todo o sistema.

Contagem de referencias

[editar | editar codigo]

A contagem de referencias da COM pode causar problemas se dois ou mais objetos sao referenciados circularmente. O projeto de uma aplicacao deve levar em contar esse tema, de forma que objetos nao se tornem orfaos.

Inferno de DLLs

[editar | editar codigo]
Ver artigo principal: Inferno de DLLs

Como a localizacao de cada componente e armazenada de maneira global no sistema (no registro do Windows), so pode existir uma versao de cada componente instalado. Dessa forma, a COM sofre seriamente do problema de inferno de DLLs, no qual duas ou mais aplicacoes requisitam diferentes versoes de um mesmo componente.

O Windows XP introduziu um novo modo de registro de objetos COM, tornando possivel as aplicacoes que precisam instalar objetos COM e todas as informacoes necessarias no diretorio da propria aplicacao ao inves de usar o registro global.

Notas e referencias

[editar | editar codigo]
  1. | Traducao livre, a citacao original foi "If you want security on the Internet, unplug your computer. ... We never made the claim up front that ActiveX is intrinsically secure."
    Peter Coffee (12 de julho de 2004). <>. eWeek.com. Consultado em 16 de abril de 2007

Ver tambem

[editar | editar codigo]

Ligacoes externas

[editar | editar codigo]
  • <> (em ingles)