Partilhar via


Interface IWbemObjectSink

A interface IWbemObjectSink cria uma interface de coletor que pode receber todos os tipos de notificações dentro do modelo de programação do WMI. Os clientes devem implementar essa interface para receber os resultados dos métodos assíncronos da IWbemServices e tipos específicos de notificações de evento. Os provedores usam, mas não implementam essa interface para fornecer eventos e objetos ao WMI.

Normalmente, os provedores chamam uma implementação fornecida a eles pelo WMI. Nesses casos, chame Indicate para fornecer objetos ao serviço do WMI. Depois disso, chame SetStatus para indicar o fim da sequência de notificação. Você também pode chamar SetStatus para indicar erros quando o coletor não tiver nenhum objeto.

Ao programar clientes assíncronos do WMI, o usuário fornece a implementação. O WMI chama os métodos para entregar objetos e definir o status do resultado.

Observação

Se um aplicativo cliente passar a mesma interface de coletor em duas chamadas assíncronas sobrepostas diferentes, o WMI não garantirá a ordem do retorno de chamada. Os aplicativos cliente que fazem chamadas assíncronas sobrepostas devem passar objetos de coletor diferentes ou serializar suas chamadas.

Observação

Como o retorno de chamada para o coletor pode não ser retornado no mesmo nível de autenticação exigido pelo cliente, é recomendável usar a comunicação semissíncrona em vez de assíncrona. Para obter mais informações, consulte Chamar um método.

Membros

A interface IWbemObjectSink tem estes tipos de membros:

Métodos

A interface IWbemObjectSink tem esses métodos.

Método Descrição
Indicate Recebe objetos de notificação.
SetStatus Chamado por fontes para indicar o fim de uma sequência de notificação ou para enviar outros códigos status para o coletor.

Comentários

Ao implementar um coletor de assinatura de evento (IWbemObjectSink ou IWbemEventSink), não chame o WMI de dentro dos métodos Indicate ou SetStatus no objeto coletor. Por exemplo, a chamada de IWbemServices::CancelAsyncCall para cancelar o coletor de dentro de uma implementação Indicate pode interferir no estado do WMI. Para cancelar uma assinatura de evento, defina um sinalizador e chame IWbemServices::CancelAsyncCall em outro thread ou objeto. Para implementações que não estejam relacionadas a um coletor de eventos, como recuperações de objeto, enumeração e consulta, você pode fazer uma chamada de volta para o WMI.

As implementações do coletor devem processar a notificação de evento dentro de 100 milissegundos, pois o thread do WMI que entrega a notificação de evento não pode executar outras tarefas até que o objeto coletor tenha concluído o processamento. Se a notificação exigir uma grande quantidade de processamento, o coletor poderá usar uma fila interna para outro thread a fim de realizar o processamento.

Exemplos

O exemplo de código a seguir é uma implementação simples de um coletor de objetos. Este exemplo pode ser usado com IWbemServices::ExecQueryAsync ou IWbemServices::CreateInstanceEnumAsync para receber as instâncias retornadas:

#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 Valor
Cliente mínimo com suporte
Windows Vista
Servidor mínimo com suporte
Windows Server 2008
Cabeçalho
Wbemcli.h (include Wbemidl.h)
Biblioteca
Wbemuuid.lib
DLL
Fastprox.dll

Confira também

API COM para WMI

Fazer uma chamada assíncrona com C++

Configurar a segurança em uma chamada assíncrona

Receber eventos pela duração do aplicativo