Поделиться через


Метод IWbemEventConsumerProvider::FindConsumer (wbemprov.h)

Функция FindConsumer находит и возвращает объекты-приемники, в которые WMI может отправлять события. WMI передает указатель на объект логического потребителя, а затем FindConsumer находит физического потребителя, связанного с логическим потребителем. Наконец, FindConsumer возвращает WMI указатель на приемник, принадлежащий физическому потребителю. WMI вызывает Метод AddRef в приемнике и начинает доставлять соответствующие события в приемник. WMI освобождает приемник после настраиваемого периода времени без доставки. При необходимости WMI может снова вызвать FindConsumer , чтобы снова загрузить приемник.

Синтаксис

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

Параметры

[in] pLogicalConsumer

Указатель на логический объект-получатель, в который должны быть доставлены объекты событий.

[out] ppConsumer

Возвращает приемник объекта события в службу управления Windows. Управление Windows вызывает AddRef для этого указателя и доставляет события, связанные с логическим потребителем, в этот приемник. В конце концов, после подходящего времени ожидания, управление Windows вызывает Release для указателя.

Возвращаемое значение

Этот метод возвращает HRESULT , указывающий состояние вызова метода. В следующем списке перечислены значения, содержащиеся в HRESULT.

Комментарии

Управление Windows предоставляет события в виде IWbemClassObject логическим потребителям, зарегистрированным в схеме. Поставщик-потребитель реализует FindConsumer для предоставления приемника событий для управления Windows всякий раз, когда события должны быть доставлены логическому потребителю.

Управление Windows распознает объект логического потребителя и имеет объекты событий, готовые к доставке. Чтобы доставить объект события, WMI затем вызывает FindConsumer. Поставщик-потребитель должен создать объект приемника событий (указатель на IWbemUnboundObjectSink) и вернуть указатель на управление Windows, чтобы можно было доставить события.

Используя этот метод, один поставщик потребителей событий может обрабатывать доставку событий множеству различных логических потребителей, возвращая разные указатели IWbemUnboundObjectSink для каждого из них.

FindConsumer можно реализовать несколькими способами:

  • Предоставление единого приемника для всех логических потребителей.

    Этот подход является наиболее эффективным с точки зрения пространства, так как в памяти хранится только один COM-объект. Например, рассмотрим поставщика потребителя событий, предоставляющего приемники для логических потребителей, которые регистрируют сообщения в файлы. Один приемник несет ответственность за изучение данных, включенных в каждый логический потребитель, и определение того, как продолжить. Скорее всего, каждое полученное событие включает открытие файла журнала, ведение журнала в журнал сообщения и закрытие файла. Хотя эта стратегия эффективна с точки зрения пространства, эта стратегия требует значительного времени обработки.

  • Укажите отдельный приемник для каждого логического потребителя.

    Этот подход оптимизирует производительность за счет подготовки выделенного приемника к получению события по мере возникновения события. Эта стратегия быстрее, чем один приемник, но менее эффективна из-за ее стоимости с точки зрения памяти. Так как каждый приемник поддерживает собственный файл журнала, он всегда может быть открыт и готов к регистрации сообщений по мере возникновения событий. Затем приемник может закрыть файл, когда WMI освобождает приемник после истечения времени ожидания, обеспечивая эффективную производительность как в высокоскоростных, так и в сценариях с низкой скоростью доставки.

  • Разделите логические потребители на группы и предоставьте разные приемники для каждой группы.

    Такой подход ставит под угрозу производительность и эффективность. Гибридный подход может включать несколько разных файлов журнала, которые могут быть привязаны к типу сообщения для ведения журнала. Несколько COM-объектов обрабатывают несколько открытых файлов. Поставщик потребителей событий, использующий этот подход, считывает имя файла журнала во время вызова FindConsumer , открывает файл и возвращает приемник, который записывает все сообщения в этот файл. Поставщик закрывает файл при последнем вызове метода Release . При таком подходе потребитель сохраняет эффективность, так как у него есть сведения о том, какой именно файл использовать; Потребитель не обязан искать или открывать новый файл. Кроме того, потребитель может сэкономить память, объединяя приемники, которые регистрируют разные сообщения в одном файле.

Независимо от подхода, реализация должна зависеть от наличия поставщика потребителя событий. WMI освобождает поставщика потребителя событий после истечения заданного интервала между вызовами. Так как WMI требует, чтобы поставщик потребителей событий предоставлял указатели на приемники для новых логических потребителей, WMI может освободить поставщика потребителей событий после того, как поставщик обслуживает всех логических потребителей. Приемники, однако, должны получать все происходящие события.

Примеры

В следующем примере кода описывается реализация FindConsumer. В следующей реализации предположим, что для получения событий существуют два приемника, по одному для каждого из двух разных зарегистрированных фильтров событий. Чтобы определить, какой приемник FindConsumer отправляет обратно в WMI, код проверяет входящий объект логического потребителя.

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

Требования

Требование Значение
Минимальная версия клиента Windows Vista
Минимальная версия сервера Windows Server 2008
Целевая платформа Windows
Header wbemprov.h (включая Wbemidl.h)
Библиотека Wbemuuid.lib
DLL Wbemsvc.dll

См. также раздел

IWbemEventConsumerProvider

Получение событий в любое время

Получение событий за период действия приложения