Compartilhar via


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 no 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á-lo usando uma classe C++. O COM foi projetado para permitir que uma classe seja usada por aplicativos diferentes, 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 DLL (biblioteca vinculada dinâmica) 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. O COM usa esse CLSID, a pedido de um cliente, para associar dados específicos à 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 sempre precisa. Em cada computador, o COM mantém um banco de dados (ele usa o registro do sistema nas plataformas Microsoft Windows e Macintosh) de todos os CLSIDs para os servidores instalados no sistema. Esse é 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 o local absoluto do código no computador.

Para sistemas distribuídos, o COM fornece entradas de registro que permitem que um servidor remoto se registre para uso por um cliente. Embora os aplicativos precisem conhecer apenas o CLSID de um servidor, pois eles podem contar com o 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. (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 . Esse é simplesmente um objeto intermediário que dá 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 de um CLSID dá suporte à interfaceIClassFactory, uma interface que inclui o métodoCreateInstanceimportante. Você implementa uma interface IClassFactory para cada classe de objeto que você oferece para ser instanciada. (Para obter mais informações sobre como implementar IClassFactory, consulte Implementing IClassFactory.)

Nota

Servidores que dão suporte a alguma outra interface de fábrica de classe personalizada não são necessários para dar suporte IClassFactory especificamente. No entanto, chamadas para funções de ativação diferentes de CoGetClassObject (como CoCreateInstanceEx) exigem que o suporte do servidor 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 objeto.) Essa função localiza o código associado ao CLSID e cria um objeto de classe e fornece um ponteiro para a interface solicitada. (CoGetClassObject usa um param riid que especifica o ponteiro de interface desejado do cliente.)

Nota

O COM tem apenas algumas funções sobre as quais muitas das outras são criadas. O mais importante deles provavelmente é CoGetClassObject, que está por trás de todas as funções de criação da 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 em 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 cuidado para 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 associam ao objeto de classe da classe para a qual são criados. Para obter mais informações, consulte de Monikers de Classe.

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 funções auxiliares de criação de instância .

criando um objeto por meio de um objeto de classe