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:
SERVICE_ENTRY Indica la compatibilidad con el id. de servicio (SID) especificado.
SERVICE_ENTRY_CHAIN Indica a IServiceProviderImpl::QueryService que encadene a otro objeto especificado.
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.