Objetos de classe COM e CLSIDs

Um servidor COM é implementado como uma classe COM. Uma classe COM é uma implementação de um grupo de interfaces em código executado sempre que você interage com um determinado objeto. Há uma distinção importante entre uma classe C++ e uma classe COM: Em C++, uma classe é um tipo, enquanto uma classe COM é simplesmente uma definição do objeto e não carrega nenhum tipo, embora um programador C++ possa implementá-la usando uma classe C++. COM é projetado para permitir que uma classe seja usada por diferentes aplicativos, incluindo aplicativos escritos sem conhecimento da existência dessa classe específica. Portanto, o código de classe para um determinado tipo de objeto existe em uma biblioteca de vínculo dinâmico (DLL) ou em outro aplicativo executável (EXE).

Cada classe COM é identificada por um CLSID, um GUID exclusivo de 128 bits, que o servidor deve registrar. COM usa esse CLSID, a pedido de um cliente, para associar dados específicos com a DLL ou EXE que contém o código que implementa a classe, criando assim uma instância do objeto.

Para clientes e servidores no mesmo computador, o CLSID do servidor é tudo o que o cliente precisa. Em cada computador, o COM mantém um banco de dados (ele faz uso do registro do sistema em plataformas Microsoft Windows e Macintosh) de todos os CLSIDs para os servidores instalados no sistema. Este é um mapeamento entre cada CLSID e o local da DLL ou EXE que abriga o código para esse CLSID. O COM consulta esse banco de dados sempre que um cliente deseja criar uma instância de uma classe COM e usar seus serviços, para que o cliente nunca precise saber a localização absoluta do código no computador.

Para sistemas distribuídos, o COM fornece entradas do Registro que permitem que um servidor remoto se registre para uso por um cliente. Enquanto os aplicativos precisam conhecer apenas o CLSID de um servidor, porque eles podem confiar no registro para localizar o servidor, o COM permite que os clientes substituam as entradas do registro e especifiquem os locais do servidor, para aproveitar ao máximo a rede. (Veja Localizando um objeto remoto.)

A maneira básica de criar uma instância de uma classe é por meio de um objeto de classe COM. Este é simplesmente um objeto intermediário que oferece suporte a funções comuns à criação de novas instâncias de uma determinada classe. A maioria dos objetos de classe usados para criar objetos a partir de um CLSID oferece suporte à interface IClassFactory, uma interface que inclui o importante método CreateInstance. Você implementa uma interface IClassFactory para cada classe de objeto que você oferece para ser instanciado. (Para obter mais informações sobre como implementar IClassFactory, consulte Implementando IClassFactory.)

Observação

Os servidores que oferecem suporte a alguma outra interface de fábrica de classe personalizada não são necessários para oferecer suporte especificamente a IClassFactory. No entanto, chamadas para funções de ativação diferentes de CoGetClassObject (como CoCreateInstanceEx) exigem que o servidor ofereça suporte a IClassFactory.

 

Quando um cliente deseja criar uma instância do objeto do servidor, ele usa o CLSID do objeto desejado em uma chamada para CoGetClassObject. (Essa chamada pode ser direta ou implícita, por meio de uma das funções auxiliares de criação de objetos.) Essa função localiza o código associado ao CLSID, cria um objeto de classe e fornece um ponteiro para a interface solicitada. (CoGetClassObject usa um parâmetro riid que especifica o ponteiro de interface desejado do cliente.)

Observação

COM tem apenas algumas funções sobre as quais muitas das outras são construídas. O mais importante deles é provavelmente CoGetClassObject, que está por trás de todas as funções de criação de instância.

 

Com esse ponteiro, o chamador pode criar uma instância do objeto e recuperar um ponteiro para uma interface solicitada no objeto. Geralmente, essa é uma interface de inicialização, usada para ativar o objeto (colocá-lo no estado de execução) para que o cliente possa fazer o que quiser com o objeto. Usando as funções básicas do COM, o cliente também deve ter o cuidado de liberar todos os ponteiros de objeto.

Outro mecanismo para ativar instâncias de objeto é por meio do moniker de classe. Os monikers de classe se vinculam ao objeto de classe da classe para a qual são criados. Para obter mais informações, consulte Monikers de classe.

COM fornece várias funções auxiliares que reduzem o trabalho de criação de instâncias de objeto. Eles são descritos em Funções auxiliares de criação de instância.

Criando um objeto por meio de um objeto de classe