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 QueryService
metody 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
QueryInterface
przekazywanie 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.