Macro della mappa servizi
Queste macro definiscono le mappe e le voci del servizio.
Nome | Descrizione |
---|---|
BEGIN_SERVICE_MAP | Contrassegna l'inizio di una mappa dei servizi ATL. |
END_SERVICE_MAP | Contrassegna la fine di una mappa dei servizi ATL. |
SERVICE_ENTRY | Indica che l'oggetto supporta un ID servizio specifico. |
SERVICE_ENTRY_CHAIN | Indica a IServiceProviderImpl::QueryService di concatenare l'oggetto specificato. |
Requisiti
Intestazione: atlcom.h
BEGIN_SERVICE_MAP
Contrassegna l'inizio della mappa dei servizi.
BEGIN_SERVICE_MAP(theClass)
Parametri
theClass
[in] Specifica la classe contenente la mappa dei servizi.
Osservazioni:
Usare la mappa dei servizi per implementare la funzionalità del provider di servizi nell'oggetto COM. Prima di tutto, è necessario derivare la classe da IServiceProviderImpl. Esistono due tipi di voci:
SERVICE_ENTRY Indica il supporto per l'ID del servizio (SID) specificato.
SERVICE_ENTRY_CHAIN indica a IServiceProviderImpl::QueryService di concatenare un altro oggetto specificato.
Esempio
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
Contrassegna la fine della mappa dei servizi.
END_SERVICE_MAP()
Esempio
Vedere l'esempio per BEGIN_SERVICE_MAP.
SERVICE_ENTRY
Indica che l'oggetto supporta l'ID del servizio specificato dal SID.
SERVICE_ENTRY( SID )
Parametri
SID
ID del servizio.
Esempio
Vedere l'esempio per BEGIN_SERVICE_MAP.
SERVICE_ENTRY_CHAIN
Indica a IServiceProviderImpl::QueryService di concatenare l'oggetto specificato da punk.
SERVICE_ENTRY_CHAIN( punk )
Parametri
Punk
Puntatore all'interfaccia IUnknown a cui concatenare.
Esempio
Vedere l'esempio per BEGIN_SERVICE_MAP.
IServiceProviderImpl::QueryService
Crea o accede al servizio specificato e restituisce un puntatore di interfaccia all'interfaccia specificata per il servizio.
STDMETHOD(QueryService)(
REFGUID guidService,
REFIID riid,
void** ppvObject);
Parametri
guidService
[in] Puntatore a un identificatore del servizio (SID).
riid
[in] Identificatore dell'interfaccia a cui il chiamante deve accedere.
ppvObj
[out] Puntatore indiretto all'interfaccia richiesta.
Valore restituito
HRESULT restituito è uno dei valori seguenti:
Valore restituito | Significato |
---|---|
S_OK | Il servizio è stato creato o recuperato correttamente. |
E_INVALIDARG | Uno o più argomenti non sono validi. |
E_OUTOFMEMORY | Memoria insufficiente per creare il servizio. |
E_UNEXPECTED | Si è verificato un errore sconosciuto. |
E_NOINTERFACE | L'interfaccia richiesta non fa parte di questo servizio o il servizio è sconosciuto. |
Osservazioni:
QueryService
restituisce un puntatore indiretto all'interfaccia richiesta nel servizio specificato. Il chiamante è responsabile del rilascio di questo puntatore quando non è più necessario.
Quando si chiama QueryService
, si passa sia un identificatore del servizio (guidService) che un identificatore di interfaccia (riid). Il guidService specifica il servizio a cui si vuole accedere e il riid identifica un'interfaccia che fa parte del servizio. In cambio, si riceve un puntatore indiretto all'interfaccia.
L'oggetto che implementa l'interfaccia potrebbe implementare anche interfacce che fanno parte di altri servizi. Considerare le possibilità seguenti:
Alcune di queste interfacce potrebbero essere facoltative. Non tutte le interfacce definite nella descrizione del servizio sono necessariamente presenti in ogni implementazione del servizio o in ogni oggetto restituito.
A differenza delle chiamate a
QueryInterface
, il passaggio di un identificatore di servizio diverso non significa necessariamente che venga restituito un oggetto COM (Component Object Model) diverso.L'oggetto restituito potrebbe avere altre interfacce che non fanno parte della definizione del servizio.
Due servizi diversi, ad esempio SID_SMyService e SID_SYourService, possono entrambi specificare l'uso della stessa interfaccia, anche se l'implementazione dell'interfaccia potrebbe non avere nulla in comune tra i due servizi. Questo approccio funziona perché una chiamata a QueryService
(SID_SMyService, IID_IDispatch) può restituire un oggetto diverso da QueryService
(SID_SYourService, IID_IDispatch). L'identità dell'oggetto non viene presupposta quando si specifica un identificatore di servizio diverso.