Interfaccia IWbemObjectSink

L'interfaccia IWbemObjectSink crea un'interfaccia sink che può ricevere tutti i tipi di notifiche all'interno del modello di programmazione WMI. I client devono implementare questa interfaccia per ricevere i risultati dei metodi asincroni di IWbemServices e tipi specifici di notifiche degli eventi. I provider usano, ma non implementano questa interfaccia per fornire eventi e oggetti a WMI.

In genere, i provider chiamano un'implementazione fornita da WMI. In questi casi, chiamare Indica per fornire oggetti al servizio WMI. Successivamente, chiamare SetStatus per indicare la fine della sequenza di notifica. È anche possibile chiamare SetStatus per indicare gli errori quando il sink non ha oggetti.

Quando si programmano client asincroni di WMI, l'utente fornisce l'implementazione. WMI chiama i metodi per recapitare oggetti e impostare lo stato del risultato.

Nota

Se un'applicazione client passa la stessa interfaccia sink in due chiamate asincrone sovrapposte diverse, WMI non garantisce l'ordine del callback. Le applicazioni client che effettuano chiamate asincrone sovrapposte devono passare oggetti sink diversi o serializzare le chiamate.

Nota

Poiché il callback al sink potrebbe non essere restituito allo stesso livello di autenticazione richiesto dal client, è consigliabile usare semisynchrono anziché la comunicazione asincrona. Per altre informazioni, vedere Chiamata di un metodo.

Membri

L'interfaccia IWbemObjectSink include questi tipi di membri:

Metodi

L'interfaccia IWbemObjectSink include questi metodi.

Metodo Descrizione
Indicare Riceve oggetti di notifica.
SetStatus Chiamata dalle origini per indicare la fine di una sequenza di notifica o per inviare altri codici di stato al sink.

Commenti

Quando si implementa un sink di sottoscrizione di eventi (IWbemObjectSink o IWbemEventSink), non chiamare in WMI dai metodi Indicate o SetStatus nell'oggetto sink. Ad esempio, chiamando IWbemServices::CancelAsyncCall per annullare il sink dall'interno di un'implementazione di Indica può interferire con lo stato WMI. Per annullare una sottoscrizione di eventi, impostare un flag e chiamare IWbemServices::CancelAsyncCall da un altro thread o oggetto. Per le implementazioni che non sono correlate a un sink di eventi, ad esempio oggetti, enumerazioni e recupero di query, è possibile richiamare in WMI.

Le implementazioni sink devono elaborare la notifica dell'evento entro 100 MSEC perché il thread WMI che recapita la notifica dell'evento non può eseguire altre operazioni fino a quando l'oggetto sink non è stato completato l'elaborazione. Se la notifica richiede una grande quantità di elaborazione, il sink può usare una coda interna per un altro thread per gestire l'elaborazione.

Esempio

L'esempio di codice seguente è una semplice implementazione di un sink di oggetti. Questo esempio può essere usato con IWbemServices::ExecQueryAsync o IWbemServices::CreateInstanceEnumAsync per ricevere le istanze restituite:

#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;
}

Requisiti

Requisito Valore
Client minimo supportato
Windows Vista
Server minimo supportato
Windows Server 2008
Intestazione
Wbemcli.h (includere Wbemidl.h)
Libreria
Wbemuuid.lib
DLL
Fastprox.dll

Vedi anche

API COM per WMI

Creazione di una chiamata asincrona con C++

Impostazione della sicurezza in una chiamata asincrona

Ricezione di eventi per la durata dell'applicazione