Compartir a través de


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

La función FindConsumer busca y devuelve objetos receptores a los que WMI puede enviar eventos. WMI pasa un puntero a un objeto de consumidor lógico y, a continuación, FindConsumer busca el consumidor físico asociado al consumidor lógico. Por último, FindConsumer vuelve a WMI un puntero al receptor que pertenece al consumidor físico. WMI llama a AddRef en el receptor y comienza a entregar los eventos adecuados al receptor. WMI libera el receptor después de un período de tiempo configurable sin entregas. Si es necesario, WMI puede volver a llamar a FindConsumer para volver a cargar el receptor.

Sintaxis

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

Parámetros

[in] pLogicalConsumer

Puntero al objeto de consumidor lógico al que se van a entregar los objetos de evento.

[out] ppConsumer

Devuelve un receptor de objetos de evento a Administración de Windows. Administración de Windows llama a AddRef para este puntero y entrega los eventos asociados al consumidor lógico a este receptor. Finalmente, después de un tiempo de espera adecuado, Administración de Windows llama a Release para el puntero.

Valor devuelto

Este método devuelve un valor HRESULT que indica el estado de la llamada al método. En la lista siguiente se muestra el valor contenido en un HRESULT.

Comentarios

Administración de Windows ofrece eventos en forma de IWbemClassObject a los consumidores lógicos registrados en el esquema. Un proveedor de consumidores implementa FindConsumer para proporcionar un receptor de eventos a administración de Windows siempre que se deba entregar eventos al consumidor lógico.

Windows Management reconoce el objeto de consumidor lógico y tiene los objetos de evento listos para su entrega. Para entregar un objeto de evento, WMI llama a FindConsumer. El proveedor de consumidores debe crear un objeto receptor de eventos (un puntero a IWbemUnboundObjectSink) y devolver el puntero a Administración de Windows para que se puedan entregar los eventos.

Con esta técnica, un único proveedor de consumidores de eventos puede controlar la entrega de eventos a muchos consumidores lógicos diferentes devolviendo diferentes punteros IWbemUnboundObjectSink para cada uno.

Puede implementar FindConsumer de varias maneras:

  • Proporcione un único receptor para todos los consumidores lógicos.

    Este enfoque es el más eficaz en términos de espacio porque solo se almacena un objeto COM en memoria. Por ejemplo, considere la posibilidad de que un proveedor de consumidores de eventos proporcione receptores para consumidores lógicos que registren mensajes en archivos: el receptor único asume la responsabilidad de examinar los datos incluidos con cada consumidor lógico y determinar cómo continuar. Lo más probable es que cada evento recibido implique abrir un archivo de registro, registrar el mensaje y cerrar el archivo. Aunque es eficaz en términos de espacio, esta estrategia implica una cantidad significativa de tiempo de procesamiento.

  • Proporcione un receptor diferente para cada consumidor lógico.

    Este enfoque optimiza el rendimiento al tener un receptor dedicado listo para recibir un evento a medida que se produce el evento. Esta estrategia es más rápida que un único receptor, pero menos eficaz debido a su costo en términos de memoria. Dado que cada receptor mantiene su propio archivo de registro, el archivo siempre puede estar abierto y listo para registrar mensajes a medida que se producen eventos. A continuación, el receptor puede cerrar el archivo cuando WMI libera el receptor después de un tiempo de espera, lo que proporciona un rendimiento eficaz tanto en escenarios de entrega de alta velocidad como en escenarios de entrega de baja velocidad.

  • Divida los consumidores lógicos en grupos y proporcione un receptor diferente para cada grupo.

    Este enfoque pone en peligro el rendimiento y la eficiencia. El enfoque híbrido puede implicar tener algunos archivos de registro diferentes, posiblemente con cada uno vinculado al tipo de mensaje que se va a registrar. Varios objetos COM controlan varios archivos abiertos. Un proveedor de consumidores de eventos que toma este enfoque lee el nombre del archivo de registro durante la llamada a FindConsumer , abre el archivo y devuelve el receptor que registra todos los mensajes en este archivo. El proveedor cierra el archivo en la última llamada al método Release . Con este enfoque, el consumidor conserva la eficiencia porque tiene información sobre exactamente qué archivo usar; No es necesario que el consumidor busque o abra un archivo nuevo. Además, el consumidor puede guardar memoria combinando receptores que registran mensajes diferentes en el mismo archivo.

Independientemente del enfoque, la implementación debe depender de la existencia de un proveedor de consumidores de eventos. WMI libera un proveedor de consumidores de eventos después de que haya transcurrido un intervalo designado entre llamadas. Dado que WMI necesita el proveedor de consumidores de eventos solo para proporcionar punteros a receptores para nuevos consumidores lógicos, WMI puede liberar el proveedor de consumidores de eventos después de que el proveedor de servicios a todos los consumidores lógicos en cuestión. Sin embargo, los receptores deben permanecer para recibir todos los eventos que se producen.

Ejemplos

En el ejemplo de código siguiente se describe una implementación de FindConsumer. En la implementación siguiente, suponga que existen dos receptores para recibir eventos, uno para cada uno de los dos filtros de eventos registrados diferentes. Para determinar qué receptor FindConsumer devuelve a WMI, el código examina el objeto de consumidor lógico entrante.

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 Value
Cliente mínimo compatible Windows Vista
Servidor mínimo compatible Windows Server 2008
Plataforma de destino Windows
Encabezado wbemprov.h (include Wbemidl.h)
Library Wbemuuid.lib
Archivo DLL Wbemsvc.dll

Consulte también

IWbemEventConsumerProvider

Recepción de eventos en todo momento

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