Método IWbemEventConsumerProvider::FindConsumer (wbemprov.h)

A função FindConsumer localiza e retorna objetos de coletor para os quais o WMI pode enviar eventos. O WMI passa um ponteiro para um objeto de consumidor lógico e, em seguida, FindConsumer localiza o consumidor físico associado ao consumidor lógico. Por fim, FindConsumer retorna ao WMI um ponteiro para o coletor que pertence ao consumidor físico. O WMI chama AddRef no coletor e começa a entregar os eventos apropriados ao coletor. O WMI libera o coletor após um período configurável sem entregas. Se necessário, o WMI pode chamar FindConsumer novamente para carregar o coletor novamente.

Sintaxe

HRESULT FindConsumer(
  [in]  IWbemClassObject       *pLogicalConsumer,
  [out] IWbemUnboundObjectSink **ppConsumer
);

Parâmetros

[in] pLogicalConsumer

Ponteiro para o objeto de consumidor lógico ao qual os objetos de evento devem ser entregues.

[out] ppConsumer

Retorna um coletor de objeto de evento para o Gerenciamento do Windows. O Gerenciamento do Windows chama AddRef para esse ponteiro e entrega os eventos associados ao consumidor lógico para esse coletor. Eventualmente, após um tempo limite adequado, o Gerenciamento do Windows chama Release para o ponteiro.

Retornar valor

Esse método retorna um HRESULT que indica o status da chamada de método. A lista a seguir lista o valor contido em um HRESULT.

Comentários

O Gerenciamento do Windows fornece eventos na forma de IWbemClassObject para consumidores lógicos registrados no esquema. Um provedor de consumidor implementa FindConsumer para fornecer um coletor de eventos para o Gerenciamento do Windows sempre que os eventos devem ser entregues ao consumidor lógico.

O Gerenciamento do Windows reconhece o objeto de consumidor lógico e tem os objetos de evento prontos para entrega. Para entregar um objeto de evento, o WMI chama FindConsumer. O provedor de consumidor deve criar um objeto de coletor de eventos (um ponteiro para IWbemUnboundObjectSink) e retornar o ponteiro para o Gerenciamento do Windows para que os eventos possam ser entregues.

Usando essa técnica, um único provedor de consumidores de eventos pode lidar com a entrega de eventos para muitos consumidores lógicos diferentes retornando diferentes ponteiros IWbemUnboundObjectSink para cada um.

Você pode implementar FindConsumer de várias maneiras:

  • Forneça um único coletor para todos os consumidores lógicos.

    Essa abordagem é a mais eficiente em termos de espaço porque apenas um objeto COM é armazenado na memória. Por exemplo, considere um provedor de consumidores de eventos que fornece coletores para consumidores lógicos que registram mensagens em arquivos: o coletor único tem a responsabilidade de examinar os dados incluídos em cada consumidor lógico e determinar como proceder. Provavelmente, cada evento recebido envolve abrir um arquivo de log, registrar a mensagem em log e fechar o arquivo. Embora seja eficiente em termos de espaço, essa estratégia envolve uma quantidade significativa de tempo de processamento.

  • Forneça um coletor diferente para cada consumidor lógico.

    Essa abordagem otimiza o desempenho, tendo um coletor dedicado pronto para receber um evento à medida que o evento ocorre. Essa estratégia é mais rápida do que um único coletor, mas menos eficiente devido ao seu custo em termos de memória. Como cada coletor mantém seu próprio arquivo de log, o arquivo sempre pode estar aberto e pronto para registrar mensagens como eventos. Em seguida, o coletor pode fechar o arquivo quando o WMI libera o coletor após um tempo limite, fornecendo um desempenho eficiente tanto em cenários de entrega de alta velocidade quanto em cenários de entrega de baixa velocidade.

  • Divida os consumidores lógicos em grupos e forneça um coletor diferente para cada grupo.

    Essa abordagem compromete o desempenho e a eficiência. A abordagem híbrida pode envolver ter alguns arquivos de log diferentes, possivelmente com cada um vinculado ao tipo de mensagem a ser registrada. Vários objetos COM lidam com vários arquivos abertos. Um provedor de consumidor de eventos que usa essa abordagem lê o nome do arquivo de log durante a chamada FindConsumer , abre o arquivo e retorna o coletor que registra todas as mensagens nesse arquivo. O provedor fecha o arquivo na última chamada para o método Release . Com essa abordagem, o consumidor preserva a eficiência porque tem informações sobre exatamente qual arquivo usar; o consumidor não é necessário para pesquisar ou abrir um novo arquivo. Além disso, o consumidor pode economizar memória combinando coletores que registram mensagens diferentes no mesmo arquivo.

Independentemente da abordagem, sua implementação deve depender da existência de um provedor de consumidor de eventos. O WMI libera um provedor de consumidor de eventos depois que um intervalo designado tiver decorrido entre as chamadas. Como o WMI precisa do provedor de consumidores de eventos apenas para fornecer ponteiros para coletores para novos consumidores lógicos, o WMI pode liberar seu provedor de consumidores de eventos depois que o provedor atende a todos os consumidores lógicos em questão. Os coletores, no entanto, devem permanecer para receber todos os eventos que ocorrem.

Exemplos

O exemplo de código a seguir descreve uma implementação de FindConsumer. Na implementação a seguir, suponha que existam dois coletores para receber eventos, um para cada um dos dois filtros de evento registrados diferentes. Para determinar qual coletor FindConsumer envia de volta ao WMI, o código examina o objeto de consumidor lógico de entrada.

HRESULT MyEventConsumerClass::FindConsumer(
   /* [in] */ IWbemClassObject __RPC_FAR *pLogicalConsumer,
   /* [out] */ IWbemUnboundObjectSink __RPC_FAR *__RPC_FAR *ppConsumer
   )
{
   // Examine the logical consumer to see which one it is.
   // ====================================================

   VARIANT v;    
   VariantInit(&v);

   HRESULT hRes = WBEM_E_NOT_FOUND;
   *ppConsumer = 0;

   pLogicalConsumer->Get(_bstr_t(L"Name"), 0, &v, 0, 0);

   // Decide which of the two logical consumers to send back.
   // =======================================================

   if (_wcsicmp(V_BSTR(&v), L"Consumer1") == 0)
   {

    //send back the Consumer1 sink to WMI
    // For example:
      /*hRes =  m_pConsumer1->
         QueryInterface(IID_IWbemUnboundObjectSink,
                           (LPVOID*)ppConsumer);*/
   }
   else if (_wcsicmp(V_BSTR(&v), L"Consumer2") == 0)
   {
    //send back the Consumer2 sink to WMI
    // For example:
      /*hRes =  m_pConsumer2->
          QueryInterface(IID_IWbemUnboundObjectSink,
                            (LPVOID*)ppConsumer);*/
   }

   VariantClear(&v);
   return hRes;
}

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Vista
Servidor mínimo com suporte Windows Server 2008
Plataforma de Destino Windows
Cabeçalho wbemprov.h (include Wbemidl.h)
Biblioteca Wbemuuid.lib
DLL Wbemsvc.dll

Confira também

IWbemEventConsumerProvider

Receber eventos o tempo todo

Receber eventos pela duração do aplicativo