IWbemObjectSink-Schnittstelle (wbemcli.h)

Die IWbemObjectSink-Schnittstelle erstellt eine Sinkschnittstelle, 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 Ereignisbenachrichtigungen zu erhalten. Anbieter verwenden diese Schnittstelle jedoch nicht, um Ereignisse und Objekte für WMI bereitzustellen.

In der Regel rufen Anbieter eine Implementierung auf, die von WMI bereitgestellt wird. In diesen Fällen rufen Sie "Indicate" auf, um Dem WMI-Dienst Objekte bereitzustellen. Rufen Sie danach SetStatus auf, um das Ende der Benachrichtigungssequenz anzugeben. Sie können "SetStatus " auch aufrufen, um Fehler anzugeben, wenn die Spüle keine Objekte enthält.

Beim Programmieren asynchroner Clients von WMI stellt der Benutzer die Implementierung bereit. WMI ruft die Methoden zum Bereitstellen von Objekten auf und legt den Status des Ergebnisses fest.

Hinweis Wenn eine Clientanwendung dieselbe Sinkschnittstelle in zwei verschiedenen überlappenden asynchronen Aufrufen übergibt, garantiert WMI nicht die Reihenfolge des Rückrufs. Clientanwendungen, die asynchrone Aufrufe überlappen, sollten entweder verschiedene Sinkobjekte übergeben oder ihre Aufrufe serialisieren.
 
Hinweis Da der Rückruf an die Spüle möglicherweise nicht auf derselben Authentifizierungsebene wie der Client erforderlich ist, empfiehlt es sich, semisynchron statt asynchroner Kommunikation zu verwenden. Weitere Informationen finden Sie unter Aufrufen einer Methode.
 

Vererbung

Die IWbemObjectSink-Schnittstelle erbt von der IUnknown-Schnittstelle . IWbemObjectSink verfügt auch über diese Arten von Elementen:

Methoden

Die IWbemObjectSink-Schnittstelle weist diese Methoden auf.

 
IWbemObjectSink::Indicate

Wird von einer Quelle aufgerufen, um eine Benachrichtigung bereitzustellen.
IWbemObjectSink::SetStatus

Wird von Quellen aufgerufen, um das Ende einer Benachrichtigungssequenz anzugeben oder andere Statuscodes an die Spüle zu senden.

Hinweise

Rufen Sie beim Implementieren eines Ereignisabonnement-Sinks (IWbemObjectSink oder IWbemEventSink) nicht in WMI aus den Methoden "Indicate " oder "SetStatus " für das Sinkobjekt auf. Beispielsweise kann das Aufrufen von IWbemServices::CancelAsyncCall zum Abbrechen des Sinkens innerhalb einer Implementierung von "Indicate " den WMI-Zustand beeinträchtigen. Um ein Ereignisabonnement abzubrechen, legen Sie ein Flag fest, und rufen Sie IWbemServices::CancelAsyncCall von einem anderen Thread oder Objekt auf. Bei Implementierungen, die nicht mit einem Ereignissenken verknüpft sind, z. B. Objekt-, Enumerations- und Abfrageabrufe, können Sie zurück in WMI aufrufen.

Sinkimplementierungen sollten die Ereignisbenachrichtigung innerhalb von 100 MSEC verarbeiten, da der WMI-Thread, der die Ereignisbenachrichtigung bereitstellt, erst dann andere Arbeiten ausführen kann, bis das Sinkobjekt die Verarbeitung abgeschlossen hat. Wenn die Benachrichtigung eine große Menge an Verarbeitung erfordert, kann die Spüle eine interne Warteschlange für einen anderen Thread verwenden, um die Verarbeitung zu verarbeiten.

Beispiele

Das folgende Codebeispiel ist eine einfache Implementierung einer Objektsenken. Dieses Beispiel kann mit IWbemServices::ExecQueryAsync oder IWbemServices::CreateInstanceEnumAsync verwendet werden, um die zurückgegebenen Instanzen zu empfangen:

C++
#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

   
Unterstützte Mindestversion (Client) Windows Vista
Unterstützte Mindestversion (Server) Windows Server 2008
Zielplattform Windows
Kopfzeile wbemcli.h (include Wbemidl.h)

Weitere Informationen

COM-API für WMI

Erstellen eines asynchronen Aufrufs mit C++

Empfangen von Ereignissen für die Dauer Ihrer Anwendung

Festlegen der Sicherheit für einen asynchronen Aufruf