Udostępnij za pośrednictwem


Makra mapy usługi

Te makra definiują mapy i wpisy usług.

Nazwa/nazwisko opis
BEGIN_SERVICE_MAP Oznacza początek mapy usługi ATL.
END_SERVICE_MAP Oznacza koniec mapy usługi ATL.
SERVICE_ENTRY Wskazuje, że obiekt obsługuje określony identyfikator usługi.
SERVICE_ENTRY_CHAIN Instruuje element IServiceProviderImpl::QueryService , aby połączyć łańcuch do określonego obiektu.

Wymagania

Nagłówek: atlcom.h

BEGIN_SERVICE_MAP

Oznacza początek mapy usługi.

BEGIN_SERVICE_MAP(theClass)

Parametry

theClass
[in] Określa klasę zawierającą mapę usługi.

Uwagi

Użyj mapy usługi, aby zaimplementować funkcje dostawcy usług w obiekcie COM. Najpierw należy utworzyć klasę z klasy IServiceProviderImpl. Istnieją dwa typy wpisów:

  • SERVICE_ENTRY Wskazuje obsługę określonego identyfikatora usługi (SID).

  • SERVICE_ENTRY_CHAIN instruuje IServiceProviderImpl::QueryService, aby połączyć łańcuch do innego określonego obiektu.

Przykład

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

Oznacza koniec mapy usługi.

END_SERVICE_MAP()

Przykład

Zobacz przykład BEGIN_SERVICE_MAP.

SERVICE_ENTRY

Wskazuje, że obiekt obsługuje identyfikator usługi określony przez identyfikator SID.

SERVICE_ENTRY( SID )

Parametry

SID
Identyfikator usługi.

Przykład

Zobacz przykład BEGIN_SERVICE_MAP.

SERVICE_ENTRY_CHAIN

Instruuje IServiceProviderImpl::QueryService , aby połączyć łańcuch do obiektu określonego przez punk.

SERVICE_ENTRY_CHAIN( punk )

Parametry

Punk
Wskaźnik do interfejsu IUnknown , do którego należy utworzyć łańcuch.

Przykład

Zobacz przykład BEGIN_SERVICE_MAP.

IServiceProviderImpl::QueryService

Tworzy lub uzyskuje dostęp do określonej usługi i zwraca wskaźnik interfejsu do określonego interfejsu dla usługi.

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

Parametry

guidService
[in] Wskaźnik do identyfikatora usługi (SID).

Riid
[in] Identyfikator interfejsu, do którego obiekt wywołujący ma uzyskać dostęp.

ppvObj
[out] Wskaźnik pośredni do żądanego interfejsu.

Wartość zwracana

Zwrócona wartość HRESULT jest jedną z następujących wartości:

Wartość zwracana Znaczenie
S_OK Usługa została pomyślnie utworzona lub pobrana.
E_INVALIDARG Co najmniej jeden argument jest nieprawidłowy.
E_OUTOFMEMORY Ilość pamięci jest niewystarczająca do utworzenia usługi.
E_UNEXPECTED Wystąpił nieznany błąd.
E_NOINTERFACE Żądany interfejs nie jest częścią tej usługi lub usługa jest nieznana.

Uwagi

QueryService Zwraca wskaźnik pośredni do żądanego interfejsu w określonej usłudze. Obiekt wywołujący jest odpowiedzialny za zwolnienie tego wskaźnika, gdy nie jest już wymagany.

Podczas wywoływania QueryServicemetody należy przekazać zarówno identyfikator usługi (guidService), jak i identyfikator interfejsu (riid). GuidService określa usługę, do której chcesz uzyskać dostęp, a riid identyfikuje interfejs, który jest częścią usługi. W zamian otrzymasz wskaźnik pośredni do interfejsu.

Obiekt, który implementuje interfejs, może również implementować interfejsy, które są częścią innych usług. Rozważ następujące możliwości:

  • Niektóre z tych interfejsów mogą być opcjonalne. Nie wszystkie interfejsy zdefiniowane w opisie usługi muszą być obecne w każdej implementacji usługi lub na każdym zwracanym obiekcie.

  • W przeciwieństwie do wywołań metody QueryInterfaceprzekazywanie innego identyfikatora usługi niekoniecznie oznacza, że zwracany jest inny obiekt modelu obiektów składników (COM).

  • Zwrócony obiekt może mieć inne interfejsy, które nie są częścią definicji usługi.

Dwie różne usługi, takie jak SID_SMyService i SID_SYourService, mogą określać użycie tego samego interfejsu, mimo że implementacja interfejsu może mieć nic wspólnego między tymi dwoma usługami. Takie podejście działa, ponieważ wywołanie QueryService metody (SID_SMyService, IID_IDispatch) może zwrócić inny obiekt niż QueryService (SID_SYourService, IID_IDispatch). Tożsamość obiektu nie jest zakładana podczas określania innego identyfikatora usługi.

Zobacz też

Makra