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


Реализация физического потребителя

Физический потребитель — это COM-объект, реализующий интерфейс IWbemUnboundObjectSink . WMI загружает физический потребитель и передает события через IWbemUnboundObjectSink в ответ на одно или несколько событий, как определено связанным логическим потребителем. Постоянные потребители предъявляют особые требования к безопасности. Дополнительные сведения см. в разделе Защита событий WMI.

В следующей процедуре описывается реализация физического потребителя для постоянного потребителя событий.

Реализация физического потребителя для постоянного потребителя событий

  1. Создайте COM-объект.

    Необходимо реализовать физического потребителя в качестве локального или удаленного сервера по протоколу COM.

  2. Определите, хотите ли вы поддерживать синхронное или асинхронное уведомление о событиях.

    При асинхронном уведомлении о событиях поток отправки не связан с принимающим потоком. Поэтому ни WMI, ни поставщик событий не блокируются, пока WMI доставляет уведомление любому потребителю, зарегистрированным для получения события. Недостаток асинхронной доставки заключается в том, что переключение контекста происходит между временем, когда поставщик создает событие, и временем, когда потребитель получает событие. Дополнительные сведения об асинхронной работе см. в разделе Основы COM в разделе COM пакета средств разработки программного обеспечения Microsoft Windows (SDK). Дополнительные сведения о переключениях контекста см. в разделе Контекстные коммутаторы в разделе Библиотеки DLL, процессы и потоки windows SDK.

    Примечание

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

     

    При синхронном уведомлении WMI доставляет уведомление в том же потоке, который поставщик событий использовал для доставки события в WMI. В этом случае, когда поставщик событий отправляет уведомление, поставщик событий блокируется WMI до тех пор, пока WMI не доставляет уведомление. Поддерживать синхронное уведомление следует только в том случае, если потребитель работает очень быстро и может обрабатывать событие за 100 микросекунд или меньше. Синхронные потребители, для обработки событий которым требуется слишком много времени, могут серьезно замедлить доставку событий всем остальным потребителям. Кроме того, они могут случайно заблокировать поставщика. Дополнительные сведения см. в разделе Привязка фильтра событий к логическому потребителю.

  3. Реализуйте функцию IWbemUnboundObjectSink::IndicateToConsumer .

    WMI использует функцию IndicateToConsumer для передачи необходимых указателей и событий физическому потребителю для синхронного и асинхронного взаимодействия. Реализация Метода IndicateToConsumer должна содержать весь необходимый код для реагирования на событие.

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

    Однако если вы хотите вернуться в WMI, используйте интерфейсы IWbemLocator и IWbemServices . Традиционным методом подключения к WMI является процесс инициализации COM-объекта. Дополнительные сведения см. в статье Создание приложения или скрипта WMI.

    Если вы реализуете физический потребитель в качестве внутрипроцессного COM-сервера и подключаетесь к WMI отдельно от процесса инициализации, необходимо использовать идентификатор класса CLSID_WbemAdministrativeLocator для доступа к интерфейсу IWbemLocator в вызове CoCreateInstance.

    В следующем примере показано, как использовать идентификатор класса CLSID_WbemAdministrativeLocator для доступа к интерфейсу IWbemLocator .

    IWbemLocator *pLoc = 0;
    
    DWORD dwRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, 0, 
        CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
    

    Интерфейс IWbemLocator получает начальный указатель пространства имен на WMI на определенном хост-компьютере. Неиспользование идентификатора CLSID_WbemAdministrativeLocator в вызове CoCreateInstance приводит к ошибке "Отказано в доступе".

    При обычных обстоятельствах WMI предоставляет клиенту асинхронные события по одному. Однако если клиент не может получать уведомления о асинхронных событиях так быстро, как поступают события, WMI начинает автоматически пакетировать события в один вызов. Автоматическая пакетная обработка помогает, если время кругового пути является проблемой, как это часто бывает в сценариях с высокой пропускной способностью. Однако пакетная обработка не повышает производительность системы в случае сбоя клиента или пропускной способности сети.