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


Внедрение физического потребителя

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

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

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

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

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

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

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

    Заметка

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

     

    При синхронном уведомлении 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 начинает автоматически пакетировать события в один вызов. Автоматическая пакетная обработка помогает, если время кругового пути является проблемой, как это часто происходит в сценариях с высокой пропускной способностью. Однако пакетная обработка не повышает производительность системы, если клиент или пропускная способность сети находятся в неисправном режиме.