Condividi tramite


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.

Vedi anche

Macro