Compartir vía


Macros de Service Map

Estas macros definen las asignaciones de servicio y las entradas.

Nombre Descripción
BEGIN_SERVICE_MAP Marca el principio de una asignación de servicio ATL.
END_SERVICE_MAP Marca el final de una asignación de servicio ATL.
SERVICE_ENTRY Indica que el objeto admite un id. de servicio específico.
SERVICE_ENTRY_CHAIN Indica a IServiceProviderImpl::QueryService que encadene al objeto especificado.

Requisitos

Encabezado: atlcom.h

BEGIN_SERVICE_MAP

Marca el principio de la asignación de servicio.

BEGIN_SERVICE_MAP(theClass)

Parámetros

theClass
[in] Especifica la clase que contiene la asignación de servicio.

Comentarios

Use la asignación de servicios para implementar la funcionalidad del proveedor de servicios en el objeto COM. En primer lugar, debe derivar la clase de IServiceProviderImpl. Hay dos tipos de entradas:

Ejemplo

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 el final de la asignación de servicio.

END_SERVICE_MAP()

Ejemplo

Consulte el ejemplo BEGIN_SERVICE_MAP.

SERVICE_ENTRY

Indica que el objeto admite el identificador de servicio especificado por SID.

SERVICE_ENTRY( SID )

Parámetros

SID
El identificador de servicio.

Ejemplo

Consulte el ejemplo BEGIN_SERVICE_MAP.

SERVICE_ENTRY_CHAIN

Indica a IServiceProviderImpl::QueryService que encadene al objeto especificado por punk.

SERVICE_ENTRY_CHAIN( punk )

Parámetros

punk
Puntero a la interfaz IUnknown a la que se va a encadenar.

Ejemplo

Consulte el ejemplo BEGIN_SERVICE_MAP.

IServiceProviderImpl::QueryService

Crea o accede al servicio especificado y devuelve un puntero de interfaz a la interfaz especificada para el servicio.

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

Parámetros

guidService
[in] Puntero a un identificador de servicio (SID).

riid
[in] Identificador de la interfaz a la que el invocador va a acceder.

ppvObj
[out] Puntero indirecto a la interfaz solicitada.

Valor devuelto

El valor HRESULT devuelto es uno de los siguientes valores:

Valor devuelto Significado
S_OK El servicio se creó o recuperó correctamente.
E_INVALIDARG Uno o varios argumentos no son válidos.
E_OUTOFMEMORY La memoria no es suficiente para crear el servicio.
E_UNEXPECTED Error desconocido.
E_NOINTERFACE La interfaz solicitada no forma parte de este servicio o el servicio es desconocido.

Comentarios

QueryService devuelve un puntero indirecto a la interfaz solicitada en el servicio especificado. El autor de la llamada es responsable de liberar este puntero cuando ya no es necesario.

Cuando se llama a QueryService, se pasa un identificador de servicio (guidService) y un identificador de interfaz (riid). GuidService especifica el servicio al que se desea acceder y el riid identifica una interfaz que forma parte del servicio. A cambio, se recibirá un puntero indirecto a la interfaz.

El objeto que implementa la interfaz también podría implementar interfaces que forman parte de otros servicios. Tenga en cuenta las siguientes posibilidades:

  • Algunas de estas interfaces pueden ser opcionales. No todas las interfaces definidas en la descripción del servicio están necesariamente presentes en cada implementación del servicio o en cada objeto devuelto.

  • A diferencia de las llamadas a QueryInterface, el pasar un identificador de servicio diferente no significa forzosamente que se devuelva un objeto del Modelo de objetos de componentes (COM) diferente.

  • El objeto devuelto podría tener otras interfaces que no forman parte de la definición del servicio.

Dos servicios diferentes, como SID_SMyService y SID_SYourService, pueden especificar el uso de la misma interfaz, aunque la implementación de la interfaz podría no tener nada en común entre los dos servicios. Este enfoque funciona, ya que una llamada a QueryService (SID_SMyService, IID_IDispatch) puede devolver un objeto diferente de QueryService (SID_SYourService, IID_IDispatch). No se asume la identidad del objeto cuando se especifica un identificador de servicio diferente.

Consulte también

Macros