Obtendo um ponteiro para um objeto

Como o COM não tem um modelo de classe estrito, há quatro maneiras pelas quais um cliente pode instanciar ou obter um ponteiro para uma interface em um objeto:

  • Chamar uma função de biblioteca COM que cria um objeto de um tipo predeterminado; ou seja, a função retornará um ponteiro para apenas uma interface específica para uma classe de objeto específica.
  • Chame uma função de biblioteca COM que possa criar um objeto com base em um identificador de classe (CLSID) e que retorne qualquer tipo de ponteiro de interface solicitado.
  • Chame um método de alguma interface que cria outro objeto (ou se conecta a um existente) e retorna um ponteiro de interface nesse objeto separado.
  • Implemente um objeto com uma interface através da qual outros objetos passam seu ponteiro de interface para o cliente diretamente.

Para obter informações sobre como obter ponteiros para outras interfaces em um objeto depois de ter a primeira, consulte QueryInterface: Navegando em um objeto.

Criando um objeto de um tipo predeterminado

Existem várias funções COM, como CoGetMalloc, que retornam ponteiros para implementações de interface específicas. (CoGetMalloc recupera um ponteiro para o alocador de memória COM padrão.) A maioria delas são funções auxiliares, e a maioria dessas funções está descrita nas seções de referência desta documentação, na área específica à qual estão relacionadas, como armazenamento ou transferência de dados.

Criando um objeto com base em um CLSID

Há várias funções que, dado um CLSID, um cliente pode chamar para criar uma instância de objeto e obter um ponteiro para ele. Todas essas funções são baseadas na função CoGetClassObject, que cria um objeto de classe e fornece um ponteiro para uma interface que permite criar instâncias dessa classe. Embora deva haver informações que digam em qual sistema o servidor reside, não há necessidade de que essas informações estejam contidas no cliente. O cliente precisa saber apenas o CLSID e nunca o caminho absoluto do código do servidor. Para obter mais informações, consulte Criando um objeto por meio de um objeto de classe.

Retornando um ponteiro para um objeto separado

Entre os muitos métodos de interface que retornam um ponteiro para um objeto separado estão vários que criam e retornam um ponteiro para um objeto enumerador, o que permite determinar quantos itens de um determinado tipo um objeto mantém. COM define interfaces para enumerar uma ampla variedade de itens, como cadeias de caracteres, estruturas importantes, monikers e ponteiros de interface IUnknown. A maneira típica de criar uma instância do enumerador e obter um ponteiro para sua interface é chamar um método de outra interface. Por exemplo, a interface IDataObject define dois métodos, EnumDAdvise e EnumFormatEtc, que retornam ponteiros para interfaces em dois objetos de enumeração diferentes. Há muitos outros exemplos em COM de métodos que retornam ponteiros para objetos, como a interface de documento composto OLE IOleObject::GetClientSite, que, quando chamado no objeto incorporado ou vinculado, retorna um ponteiro para a implementação do objeto de contêiner de IOleClientSite.

Implementando um objeto através do qual passar um ponteiro de interface diretamente para o cliente

Quando dois objetos, como um contêiner de documento composto OLE e um servidor, precisam de comunicação bidirecional, cada um implementa um objeto que contém um método de interface por meio do qual ele pode passar um ponteiro de interface para o outro objeto. O objeto de implementação, que também é o cliente do objeto criado, pode chamar o método e obter o ponteiro que foi passado.

Clientes e servidores COM

Responsabilidades do servidor COM