Teilen über


IServiceProviderImpl-Klasse

Diese Klasse stellt eine Standardimplementierung der IServiceProvider Schnittstelle bereit.

Syntax

template <class T>
class ATL_NO_VTABLE IServiceProviderImpl : public IServiceProvider

Parameter

T
Ihre Klasse, abgeleitet von IServiceProviderImpl.

Member

Öffentliche Methoden

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

Hinweise

Die IServiceProvider Schnittstelle sucht einen durch seine GUID angegebenen Dienst und gibt den Schnittstellenzeiger für die angeforderte Schnittstelle für den Dienst zurück. Klasse IServiceProviderImpl stellt eine Standardimplementierung dieser Schnittstelle bereit.

IServiceProviderImpl Gibt eine Methode an: QueryService, die den angegebenen Dienst erstellt oder darauf zugreift und einen Schnittstellenzeiger auf die angegebene Schnittstelle für den Dienst zurückgibt.

IServiceProviderImpl verwendet eine Dienstkarte, beginnend mit BEGIN_SERVICE_MAP und endet mit END_SERVICE_MAP.

Die Dienstzuordnung enthält zwei Einträge: SERVICE_ENTRY, die eine angegebene Dienst-ID (SID) angibt, die vom Objekt unterstützt wird, und SERVICE_ENTRY_CHAIN, die aufruft QueryService , an ein anderes Objekt zu verketten.

Vererbungshierarchie

IServiceProvider

IServiceProviderImpl

Anforderungen

Kopfzeile: atlcom.h

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

Der zurückgegebene HRESULT-Wert ist einer der folgenden:

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 Aufrufer 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. Beachten Sie Folgendes:

  • 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 das Übergeben 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 zusätzliche 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. Dies 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

Klassenübersicht