Partilhar via


Objetos de classe COM e CLSIDs

Um servidor COM é implementado como uma classe COM. Um de 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 vinculada dinâmica (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, 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 hospeda o código para esse CLSID. COM consulta este 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, COM fornece entradas de registro que permitem que um servidor remoto se registre para uso por um cliente. Enquanto os aplicativos precisam saber 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 locais do servidor, para aproveitar ao máximo a rede. (Consulte 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 suporta funções comuns à criação de novas instâncias de uma determinada classe. A maioria dos objetos de classe usados para criar objetos de um CLSID suporta a interfaceIClassFactory, uma interface que inclui o importante método CreateInstance. Você implementa um IClassFactory interface para cada classe de objeto que você oferece para ser instanciado. (Para obter mais informações sobre como implementar IClassFactory, consulte Implementing IClassFactory.)

Observação

Servidores que suportam alguma outra interface de fábrica de classe personalizada não são necessários para suportar IClassFactory especificamente. No entanto, chamadas para funções de ativação diferentes de CoGetClassObject (como CoCreateInstanceEx) exigem que o servidor suporte 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. (Esta chamada pode ser direta ou implícita, através de uma das funções auxiliares de criação de objetos.) Esta 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 riid param 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 subjaz a 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. Isso geralmente é uma interface de inicialização, usada para ativar o objeto (colocá-lo no estado de execução) para que o cliente possa fazer qualquer trabalho com o objeto que ele deseja. 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 é através do moniker de classe. Os monikers de classe se ligam ao objeto de classe da classe para a qual foram criados. Para obter mais informações, consulte Class Monikers.

O COM fornece várias funções auxiliares que reduzem o trabalho de criação de instâncias de objeto. Elas são descritas em Instance Creation Helper Functions.

Criando um objeto por meio de um objeto de classe