IWbemObjectSink-Schnittstelle
Die IWbemObjectSink-Schnittstelle erstellt eine Senkenschnittstelle, die alle Arten von Benachrichtigungen innerhalb des WMI-Programmiermodells empfangen kann. Clients müssen diese Schnittstelle implementieren, um sowohl die Ergebnisse der asynchronen Methoden von IWbemServices als auch bestimmte Arten von Ereignisbenachrichtigungen zu empfangen. Anbieter verwenden diese Schnittstelle, um Ereignisse und Objekte für WMI bereitzustellen, implementieren sie jedoch nicht.
In der Regel rufen Anbieter eine Implementierung auf, die ihnen von WMI bereitgestellt wird. Rufen Sie in diesen Fällen Indicate auf, um Objekte für den WMI-Dienst bereitzustellen. Rufen Sie danach SetStatus auf, um das Ende der Benachrichtigungssequenz anzugeben. Sie können auch SetStatus aufrufen, um Fehler anzuzeigen, wenn die Senke keine Objekte enthält.
Beim Programmieren asynchroner Clients von WMI stellt der Benutzer die Implementierung bereit. WMI ruft die Methoden auf, um Objekte zu übermitteln und den Status des Ergebnisses festzulegen.
Hinweis
Wenn eine Clientanwendung dieselbe Senkenschnittstelle in zwei verschiedenen überlappenden asynchronen Aufrufen übergibt, garantiert WMI nicht die Reihenfolge des Rückrufs. Clientanwendungen, die überlappende asynchrone Aufrufe ausführen, sollten entweder verschiedene Senkenobjekte übergeben oder die Aufrufe serialisieren.
Hinweis
Da der Rückruf an die Senke möglicherweise nicht auf der Authentifizierungsebene zurückgegeben wird, die der Client benötigt, empfiehlt es sich, anstelle der asynchronen Kommunikation eine halbsynchrone Kommunikation zu verwenden. Weitere Informationen finden Sie unter Aufrufen einer Methode.
Member
Die IWbemObjectSink-Schnittstelle weist drei Typen von Membern auf:
Methoden
Die IWbemObjectSink-Schnittstelle weist diese Methoden auf.
Methode | BESCHREIBUNG |
---|---|
Indicate | Empfängt Benachrichtigungsobjekte. |
SetStatus | Wird von Quellen aufgerufen, um das Ende einer Benachrichtigungssequenz anzugeben oder andere Statuscodes an die Senke zu senden. |
Bemerkungen
Führen Sie beim Implementieren einer Ereignisabonnementsenke (IWbemObjectSink oder IWbemEventSink) keinen Aufruf von WMI aus den Methoden Indicate oder SetStatus für das Senkenobjekt aus. Beispielsweise kann der Aufruf von IWbemServices::CancelAsyncCall zum Kündigen der Senke innerhalb einer Implementierung von Indicate zu Konflikten mit dem WMI-Zustand führen. Legen Sie zum Kündigen eines Ereignisabonnements ein Flag fest, und rufen Sie IWbemServices::CancelAsyncCall aus einem anderen Thread oder Objekt auf. Für Implementierungen, die sich nicht auf eine Ereignissenke beziehen, z. B. Objekt-, Enumerations- und Abfrageabrufe, können Sie Rückrufe an WMI ausführen.
Senkenimplementierungen sollten die Ereignisbenachrichtigung innerhalb von 100 ms verarbeiten, da der WMI-Thread, der die Ereignisbenachrichtigung übermittelt, keine anderen Aufgaben ausführen kann, bis das Senkenobjekt die Verarbeitung abgeschlossen hat. Wenn die Benachrichtigung einen großen Verarbeitungsumfang erfordert, kann die Senke eine interne Warteschlange für einen anderen Thread verwenden, um die Verarbeitung auszuführen.
Beispiele
Das folgende Codebeispiel ist eine einfache Implementierung einer Objektsenke. Dieses Beispiel kann mit IWbemServices::ExecQueryAsync oder IWbemServices::CreateInstanceEnumAsync verwendet werden, um die zurückgegebenen Instanzen zu empfangen:
#include <iostream>
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
class QuerySink : public IWbemObjectSink
{
LONG m_lRef;
bool bDone;
public:
QuerySink() { m_lRef = 0; }
~QuerySink() { bDone = TRUE; }
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
virtual HRESULT STDMETHODCALLTYPE
QueryInterface(REFIID riid, void** ppv);
virtual HRESULT STDMETHODCALLTYPE Indicate(
/* [in] */
LONG lObjectCount,
/* [size_is][in] */
IWbemClassObject __RPC_FAR *__RPC_FAR *apObjArray
);
virtual HRESULT STDMETHODCALLTYPE SetStatus(
/* [in] */ LONG lFlags,
/* [in] */ HRESULT hResult,
/* [in] */ BSTR strParam,
/* [in] */ IWbemClassObject __RPC_FAR *pObjParam
);
};
ULONG QuerySink::AddRef()
{
return InterlockedIncrement(&m_lRef);
}
ULONG QuerySink::Release()
{
LONG lRef = InterlockedDecrement(&m_lRef);
if(lRef == 0)
delete this;
return lRef;
}
HRESULT QuerySink::QueryInterface(REFIID riid, void** ppv)
{
if (riid == IID_IUnknown || riid == IID_IWbemObjectSink)
{
*ppv = (IWbemObjectSink *) this;
AddRef();
return WBEM_S_NO_ERROR;
}
else return E_NOINTERFACE;
}
HRESULT QuerySink::Indicate(long lObjCount, IWbemClassObject **pArray)
{
for (long i = 0; i < lObjCount; i++)
{
IWbemClassObject *pObj = pArray[i];
// ... use the object.
// AddRef() is only required if the object will be held after
// the return to the caller.
}
return WBEM_S_NO_ERROR;
}
HRESULT QuerySink::SetStatus(
/* [in] */ LONG lFlags,
/* [in] */ HRESULT hResult,
/* [in] */ BSTR strParam,
/* [in] */ IWbemClassObject __RPC_FAR *pObjParam
)
{
printf("QuerySink::SetStatus hResult = 0x%X\n", hResult);
return WBEM_S_NO_ERROR;
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) |
Windows Vista |
Unterstützte Mindestversion (Server) |
Windows Server 2008 |
Header |
|
Bibliothek |
|
DLL |
|