Interfaz IWbemObjectSink

La interfaz IWbemObjectSink crea una interfaz de receptor que puede recibir todos los tipos de notificaciones dentro del modelo de programación de WMI. Los clientes deben implementar esta interfaz para recibir los resultados de los métodos asincrónicos de IWbemServices y tipos específicos de notificaciones de eventos. Los proveedores usan, pero no implementan, esta interfaz para proporcionar eventos y objetos a WMI.

Normalmente, los proveedores llaman a una implementación que proporciona WMI. En estos casos, llame a Indicate para proporcionar objetos al servicio de WMI. Después, llame a SetStatus para indicar el final de la secuencia de notificación. También puede llamar a SetStatus para indicar errores cuando el receptor no tiene ningún objeto.

Al programar clientes asincrónicos de WMI, el usuario proporciona la implementación. WMI llama a los métodos para entregar objetos y establecer el estado del resultado.

Nota

Si una aplicación cliente pasa la misma interfaz de receptor en dos llamadas asincrónicas superpuestas diferentes, WMI no garantiza el orden de la devolución de llamada. Las aplicaciones cliente que realizan llamadas asincrónicas superpuestas deben pasar objetos receptores diferentes o serializar sus llamadas.

Nota

Como es posible que la devolución de llamada al receptor no se devuelva en el mismo nivel de autenticación que requiere el cliente, se recomienda usar la comunicación semisincrónica en lugar de la asincrónica. Para más información, vea Llamada a un método.

Miembros

La interfaz IWbemObjectSink tiene estos tipos de miembros:

Métodos

La interfaz IWbemObjectSink tiene estos métodos.

Método Descripción
Indicar Recibe objetos de notificación.
SetStatus Los orígenes llaman a este método para indicar el final de una secuencia de notificación o para enviar otros códigos de estado al receptor.

Comentarios

Al implementar un receptor de suscripción de eventos (IWbemObjectSink o IWbemEventSink), no llame a WMI desde los métodos Indicate o SetStatus en el objeto receptor. Por ejemplo, llamar a IWbemServices::CancelAsyncCall para cancelar el receptor desde una implementación de Indicate puede interferir con el estado de WMI. Para cancelar una suscripción de evento, establezca una marca y llame a IWbemServices::CancelAsyncCall desde otro subproceso u objeto. En el caso de las implementaciones que no están relacionadas con un receptor de eventos, como las recuperaciones de objetos, enumeraciones y consultas, puede volver a llamar a WMI.

Las implementaciones del receptor deben procesar la notificación de eventos en 100 ms porque el subproceso WMI que entrega la notificación de eventos no puede realizar otro trabajo hasta que el objeto receptor haya completado el procesamiento. Si la notificación requiere una gran cantidad de procesamiento, el receptor puede usar una cola interna para otro subproceso a fin de controlar el procesamiento.

Ejemplos

El ejemplo de código siguiente es una implementación sencilla de un receptor de objetos. Este ejemplo se puede usar con IWbemServices::ExecQueryAsync o IWbemServices::CreateInstanceEnumAsync para recibir las instancias devueltas:

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

Requisitos

Requisito Value
Cliente mínimo compatible
Windows Vista
Servidor mínimo compatible
Windows Server 2008
Encabezado
Wbemcli.h (incluye Wbemidl.h)
Biblioteca
Wbemuuid.lib
Archivo DLL
Fastprox.dll

Consulte también

API COM para WMI

Realización de una llamada asincrónica con C++

Establecimiento de la seguridad en una llamada asincrónica

Recepción de eventos durante la duración de la aplicación