Servicezuordnungs-Makros

Diese Makros definieren Dienstzuordnungen und -einträge.

Name Beschreibung
BEGIN_SERVICE_MAP Markiert den Anfang einer ATL-Dienstzuordnung.
END_SERVICE_MAP Markiert das Ende einer ATL-Dienstkarte.
SERVICE_ENTRY Gibt an, dass das Objekt eine bestimmte Dienst-ID unterstützt.
SERVICE_ENTRY_CHAIN Weist IServiceProviderImpl::QueryService an, mit dem angegebenen Objekt zu verketten.

Anforderungen

Kopfzeile: atlcom.h

BEGIN_SERVICE_MAP

Markiert den Anfang der Dienstkarte.

BEGIN_SERVICE_MAP(theClass)

Parameter

theClass
[in] Gibt die Klasse an, die die Dienstzuordnung enthält.

Hinweise

Verwenden Sie die Dienstzuordnung, um Dienstanbieterfunktionen in Ihrem COM-Objekt zu implementieren. Zuerst müssen Sie Ihre Klasse von IServiceProviderImpl ableiten. Es gibt zwei Arten von Einträgen:

  • SERVICE_ENTRY Gibt die Unterstützung für die angegebene Dienst-ID (SID) an.

  • SERVICE_ENTRY_CHAIN Weist IServiceProviderImpl::QueryService an, eine Kette mit einem anderen, angegebenen Objekt zu erstellen.

Beispiel

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

Markiert das Ende der Dienstkarte.

END_SERVICE_MAP()

Beispiel

Sehen Sie sich das Beispiel für BEGIN_SERVICE_MAP an.

SERVICE_ENTRY

Gibt an, dass das Objekt die von der SID angegebene Dienst-ID unterstützt.

SERVICE_ENTRY( SID )

Parameter

SID
Die Dienst-ID.

Beispiel

Sehen Sie sich das Beispiel für BEGIN_SERVICE_MAP an.

SERVICE_ENTRY_CHAIN

Weist IServiceProviderImpl::QueryService an, mit dem durch Punk angegebenen Objekt zu verketten.

SERVICE_ENTRY_CHAIN( punk )

Parameter

Punk
Ein Zeiger auf die IUnknown-Schnittstelle, mit der verkettet werden soll.

Beispiel

Sehen Sie sich das Beispiel für BEGIN_SERVICE_MAP an.

IServiceProviderImpl::QueryService

Erstellt oder greift auf den angegebenen Dienst zu und gibt einen Schnittstellenzeiger auf die angegebene Schnittstelle für den Dienst zurück.

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

Parameter

guidService
[in] Zeiger auf einen Dienstbezeichner (SID).

riid
[in] Bezeichner der Schnittstelle, auf die der Aufrufer Zugriff erhält.

ppvObj
[out] Indirekter Zeiger auf die angeforderte Schnittstelle.

Rückgabewert

Das zurückgegebene HRESULT ist einer der folgenden Werte:

Rückgabewert Bedeutung
S_OK Der Dienst wurde erfolgreich erstellt oder abgerufen.
E_INVALIDARG Mindestens eines der Argumente ist ungültig.
E_OUTOFMEMORY Der Arbeitsspeicher reicht nicht aus, um den Dienst zu erstellen.
E_UNEXPECTED Unbekannter Fehler aufgetreten.
E_NOINTERFACE Die angeforderte Schnittstelle ist nicht Teil dieses Diensts, oder der Dienst ist unbekannt.

Hinweise

QueryService gibt einen indirekten Zeiger auf die angeforderte Schnittstelle im angegebenen Dienst zurück. Der Anrufer ist dafür verantwortlich, diesen Zeiger freizugeben, wenn er nicht mehr benötigt wird.

Beim Aufrufen QueryServiceübergeben Sie sowohl einen Dienstbezeichner (guidService) als auch einen Schnittstellenbezeichner (riid). Der guidService gibt den Dienst an, auf den Sie zugreifen möchten, und die Riid identifiziert eine Schnittstelle, die Teil des Diensts ist. Im Gegenzug erhalten Sie einen indirekten Zeiger auf die Schnittstelle.

Das Objekt, das die Schnittstelle implementiert, kann auch Schnittstellen implementieren, die Teil anderer Dienste sind. Berücksichtigen Sie die folgenden Möglichkeiten:

  • Einige dieser Schnittstellen können optional sein. Nicht alle in der Dienstbeschreibung definierten Schnittstellen sind unbedingt für jede Implementierung des Diensts oder für jedes zurückgegebene Objekt vorhanden.

  • Im Gegensatz zu QueryInterfaceAufrufen bedeutet die Übergabe eines anderen Dienstbezeichners nicht unbedingt, dass ein anderes COM-Objekt (Component Object Model) zurückgegeben wird.

  • Das zurückgegebene Objekt verfügt möglicherweise über andere Schnittstellen, die nicht Teil der Definition des Diensts sind.

Zwei unterschiedliche Dienste, z. B. SID_SMyService und SID_SYourService, können beide die Verwendung derselben Schnittstelle angeben, obwohl die Implementierung der Schnittstelle zwischen den beiden Diensten möglicherweise nichts gemeinsam hat. Dieser Ansatz funktioniert, da ein Aufruf QueryService von (SID_SMyService, IID_IDispatch) ein anderes Objekt QueryService als (SID_SYourService, IID_IDispatch) zurückgeben kann. Die Objektidentität wird nicht angenommen, wenn Sie einen anderen Dienstbezeichner angeben.

Siehe auch

Makros