Partilhar via


Classe IServiceProviderImpl

Essa classe fornece uma implementação padrão da interface IServiceProvider.

Sintaxe

template <class T>
class ATL_NO_VTABLE IServiceProviderImpl : public IServiceProvider

Parâmetros

T
Sua classe, derivada de IServiceProviderImpl.

Membros

Métodos públicos

Nome Descrição
IServiceProviderImpl::QueryService Cria ou acessa o serviço especificado e retorna um ponteiro de interface para a interface especificada para o serviço.

Comentários

A interface IServiceProvider localiza um serviço especificado pelo GUID e retorna o ponteiro de interface para a interface solicitada no serviço. A classe IServiceProviderImpl fornece uma implementação padrão dessa interface.

IServiceProviderImpl especifica um método: QueryService, que cria ou acessa o serviço especificado e retorna um ponteiro de interface para a interface especificada para o serviço.

IServiceProviderImpl usa um mapa do serviço, começando com BEGIN_SERVICE_MAP e terminando com END_SERVICE_MAP.

O mapa do serviço contém duas entradas: SERVICE_ENTRY, que indica uma SID (ID de serviço) especificada compatível com o objeto, e SERVICE_ENTRY_CHAIN, que chama QueryService para encadear para outro objeto.

Hierarquia de herança

IServiceProvider

IServiceProviderImpl

Requisitos

Cabeçalho: atlcom.h

IServiceProviderImpl::QueryService

Cria ou acessa o serviço especificado e retorna um ponteiro de interface para a interface especificada para o serviço.

STDMETHOD(QueryService)(
    REFGUID guidService,
    REFIID riid,
    void** ppvObject);

Parâmetros

guidService
[in] Ponteiro para um SID (identificador de serviço).

riid
[in] Identificador da interface à qual o chamador deve obter acesso.

ppvObj
[out] Ponteiro indireto para a interface solicitada.

Valor de retorno

O valor retornado de HRESULT é um dos seguintes valores:

Valor retornado Significado
S_OK O serviço foi criado ou recuperado com êxito.
E_INVALIDARG Um ou mais argumentos são inválidos.
E_OUTOFMEMORY A memória é insuficiente para criar o serviço.
E_UNEXPECTED Ocorreu um erro desconhecido.
E_NOINTERFACE A interface solicitada não faz parte desse serviço ou o serviço é desconhecido.

Comentários

QueryService retorna um ponteiro indireto para a interface solicitada no serviço especificado. O chamador é responsável por liberar esse ponteiro quando ele não é mais necessário.

Quando você chama QueryService, passa um identificador de serviço (guidService) e um identificador de interface (riid). O guidService especifica o serviço ao qual você deseja acessar e o riid identifica uma interface que faz parte do serviço. Em troca, você recebe um ponteiro indireto para a interface.

O objeto que implementa a interface também pode implementar interfaces que fazem parte de outros serviços. Considere o seguinte:

  • Algumas dessas interfaces podem ser opcionais. Nem todas as interfaces definidas na descrição do serviço estão necessariamente presentes em cada implementação do serviço ou em cada objeto retornado.

  • Diferentemente das chamadas para QueryInterface, passar um identificador de serviço diferente não significa necessariamente que um objeto COM (Component Object Model) diferente seja retornado.

  • O objeto retornado pode ter interfaces adicionais que não fazem parte da definição do serviço.

Dois serviços diferentes, como SID_SMyService e SID_SYourService, podem especificar o uso da mesma interface, embora a implementação da interface possa não ter nada em comum entre os dois serviços. Isso funciona, pois uma chamada para QueryService (SID_SMyService, IID_IDispatch) pode retornar um objeto diferente de QueryService (SID_SYourService, IID_IDispatch). A identidade do objeto não é assumida quando você especifica um identificador de serviço diferente.

Confira também

Visão geral da aula