Implementar um consumidor físico

Um consumidor físico é um objeto COM que implementa a interface IWbemUnboundObjectSink. O WMI carrega seu consumidor físico e passa eventos por meio de IWbemUnboundObjectSink em resposta a um ou mais eventos, conforme definido pelo consumidor lógico associado. Os consumidores permanentes têm requisitos especiais de segurança. Para obter mais informações, consulte Proteger eventos do WMI.

O procedimento a seguir descreve como implementar um consumidor físico para um consumidor de evento permanente.

Para implementar um consumidor físico para um consumidor de evento permanente

  1. Cria um objeto COM.

    Implemente um consumidor físico como um servidor local ou remoto usando o protocolo COM.

  2. Determine se deseja dar suporte à notificação de evento síncrono ou assíncrono.

    Com a notificação de evento assíncrono, o thread de envio não está relacionado ao thread de recebimento. Portanto, nem o WMI nem o provedor de eventos são bloqueados enquanto o WMI entrega uma notificação a qualquer consumidor registrado para receber o evento. A desvantagem da entrega assíncrona é que uma opção de contexto ocorre entre a hora em que o provedor produz o evento e a hora em que o consumidor recebe o evento. Para obter mais informações sobre como trabalhar de forma assíncrona, consulte o tópico Conceitos básicos do COM na seção COM do SDK (Software Development Kit) do Microsoft Windows. Para obter mais informações sobre opções de contexto, consulte o tópico Comutadores de Contexto na seção DLLs, Processos e Threads do SDK do Windows.

    Observação

    Como o retorno de chamada para o coletor pode não ser retornado no mesmo nível de autenticação exigido pelo cliente, é recomendável que você use comunicação semissíncrona em vez de assíncrona. Para obter mais informações, consulte Chamar um método.

     

    Com a notificação síncrona, o WMI entrega a notificação no mesmo thread que o provedor de eventos usou para entregar o evento ao WMI. Nesse caso, quando um provedor de eventos envia uma notificação, o provedor de eventos é bloqueado pelo WMI até que o WMI entregue a notificação. Somente se o consumidor for extremamente rápido e puder processar um evento em 100 microssegundos ou menos, você deverá considerar dar suporte à notificação síncrona. Consumidores síncronos que levam muito tempo para processar eventos podem retardar seriamente a entrega de eventos para todos os outros consumidores. Além disso, eles podem bloquear inadvertidamente o provedor. Para obter mais informações, consulte Associar um filtro de evento a um consumidor lógico.

  3. Implemente a função IWbemUnboundObjectSink::IndicateToConsumer.

    O WMI usa a função IndicateToConsumer para passar os ponteiros e eventos necessários para o consumidor físico para comunicações síncronas e assíncronas. Sua implementação de IndicateToConsumer deve conter todo o código necessário para responder a um evento.

    Ao contrário de um consumidor de evento temporário, você não precisa chamar a interface IWbemLocator para entrar em contato com o WMI. Em vez disso, o WMI localiza um ponteiro para o consumidor por meio do provedor de consumidor de eventos. Para obter mais informações, consulte Gravar um provedor de consumidores de eventos.

    No entanto, caso queira chamar novamente no WMI, use as interfaces IWbemLocator e IWbemServices. O método tradicional para se conectar ao WMI é durante o processo de inicialização do objeto COM. Para obter mais informações, consulte Criar um aplicativo ou script do WMI.

    Caso implemente seu consumidor físico como um servidor COM em processo e se conectar ao WMI separadamente do processo de inicialização, deverá usar o identificador de classe CLSID_WbemAdministrativeLocator para acessar a interface IWbemLocator na chamada para CoCreateInstance.

    O exemplo a seguir mostra como usar o identificador de classe CLSID_WbemAdministrativeLocator para acessar a interface IWbemLocator.

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

    A interface IWbemLocator obtém o ponteiro de namespace inicial para o WMI em um computador host específico. A falha ao usar o identificador CLSID_WbemAdministrativeLocator na chamada CoCreateInstance resulta em um erro de "acesso negado".

    Em circunstâncias habituais, o WMI entrega eventos assíncronos ao cliente um de cada vez. No entanto, se um cliente não puder receber notificações de evento assíncronas tão rápido quanto os eventos chegarem, o WMI começará a agrupar automaticamente eventos em uma única chamada. O envio automático em lote ajuda se os tempos de viagem de ida e volta são um problema, como geralmente acontece em cenários de alta taxa de transferência. No entanto, o envio em lote não melhorará o desempenho do sistema se o cliente ou a largura de banda de rede falharem.