Compartilhar via


Macros de mapa de serviço

Essas macros definem mapas e entradas de serviço.

Nome Descrição
BEGIN_SERVICE_MAP Marca o início de um mapa de serviço ATL.
END_SERVICE_MAP Marca o fim de um mapa de serviço ATL.
SERVICE_ENTRY Indica que o objeto dá suporte a uma ID de serviço específica.
SERVICE_ENTRY_CHAIN Instrui IServiceProviderImpl::QueryService a encadear o objeto especificado.

Requisitos

Cabeçalho: atlcom.h

BEGIN_SERVICE_MAP

Marca o início do mapa de serviço.

BEGIN_SERVICE_MAP(theClass)

Parâmetros

theClass
[in] Especifica a classe que contém o mapa de serviço.

Comentários

Use o mapa do serviço para implementar a funcionalidade do provedor de serviços em seu objeto COM. Primeiro, você deve derivar sua classe de IServiceProviderImpl. Há dois tipos de entradas:

Exemplo

BEGIN_SERVICE_MAP(CMyService)
   SERVICE_ENTRY(SID_SBindHost)  // This object supports the SBindHost service
   SERVICE_ENTRY_CHAIN(m_spClientSite) // Everything else, just ask the container
END_SERVICE_MAP()

END_SERVICE_MAP

Marca o final do mapa de serviço.

END_SERVICE_MAP()

Exemplo

Consulte o exemplo de BEGIN_SERVICE_MAP.

SERVICE_ENTRY

Indica que o objeto dá suporte à ID de serviço especificada pelo SID.

SERVICE_ENTRY( SID )

Parâmetros

SID
A ID do serviço.

Exemplo

Consulte o exemplo de BEGIN_SERVICE_MAP.

SERVICE_ENTRY_CHAIN

Instrui IServiceProviderImpl::QueryService a encadear o objeto especificado por punk.

SERVICE_ENTRY_CHAIN( punk )

Parâmetros

punk
Um ponteiro para a interface IUnknown à qual encadear.

Exemplo

Consulte o exemplo de BEGIN_SERVICE_MAP.

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 HRESULT retornado é 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 as seguintes possibilidades:

  • 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 outras interfaces 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. Essa abordagem funciona porque 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

Macros