Classe IServiceProviderImpl
Questa classe fornisce un'implementazione predefinita dell'interfaccia IServiceProvider
.
Sintassi
template <class T>
class ATL_NO_VTABLE IServiceProviderImpl : public IServiceProvider
Parametri
T
Classe derivata da IServiceProviderImpl
.
Membri
Metodi pubblici
Nome | Descrizione |
---|---|
IServiceProviderImpl::QueryService | Crea o accede al servizio specificato e restituisce un puntatore di interfaccia all'interfaccia specificata per il servizio. |
Osservazioni:
L'interfaccia IServiceProvider
individua un servizio specificato dal RELATIVO GUID e restituisce il puntatore di interfaccia per l'interfaccia richiesta nel servizio. La classe IServiceProviderImpl
fornisce un'implementazione predefinita di questa interfaccia.
IServiceProviderImpl
specifica un metodo: QueryService, che crea o accede al servizio specificato e restituisce un puntatore di interfaccia all'interfaccia specificata per il servizio.
IServiceProviderImpl
usa una mappa dei servizi, a partire da BEGIN_SERVICE_MAP e termina con END_SERVICE_MAP.
La mappa dei servizi contiene due voci: SERVICE_ENTRY, che indica un ID servizio (SID) specificato supportato dall'oggetto e SERVICE_ENTRY_CHAIN, che chiama QueryService
per concatenare a un altro oggetto.
Gerarchia di ereditarietà
IServiceProvider
IServiceProviderImpl
Requisiti
Intestazione: atlcom.h
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
Il valore HRESULT restituito è uno dei 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 quanto segue:
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 interfacce aggiuntive 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. Questa operazione 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.