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:
SERVICE_ENTRY Indica suporte para a SID (ID de serviço) especificada.
SERVICE_ENTRY_CHAIN Instrui IServiceProviderImpl::QueryService a encadear para outro objeto especificado.
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.