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
QueryInterface
Aufrufen 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.