Receber notificações de eventos síncronos e semissíncronos

Use SWbemServices.ExecQuery para solicitar todos os eventos existentes.

O exemplo de código a seguir mostra como consultar os eventos em um log.

Select * from Win32_NTLogEvent

Para obter mais informações, consulte Determinar o tipo de evento a receber, Receber notificações de evento e WQL (SQL para WMI).

A chamada padrão para SWbemServices.ExecNotificationQuery usa comunicação semissíncrona. O parâmetro iflags tem os sinalizadores wbemFlagForwardOnly e wbemFlagReturnImmediately definidos por padrão. Para obter mais informações, consulte Chamar um método.

O procedimento a seguir descreve como receber notificação de evento semissíncrono usando VBScript.

Para receber notificação de evento semissíncrono no VBScript

  1. Crie uma consulta para o tipo de evento que você deseja receber. Para obter mais informações, consulte Determinar o tipo de evento a receber.

  2. Se você solicitar um tipo de evento de instância como __InstanceCreationEvent, indique na consulta um tipo de instância de destino, por exemplo, Win32_LogicalDisk.

  3. Se necessário, especifique uma instância, por exemplo, o nome de um namespace ao solicitar instâncias futuras de __NamespaceModificationEvent para um namespace específico.

  4. Especifique um intervalo de sondagem para o WMI (Instrumentação de Gerenciamento do Windows) em uma consulta, como "WITHIN 10"— para sondar a cada 10 segundos. Para obter mais informações, consulte Cláusula WITHIN.

  5. Chame SWbemServices.ExecNotificationQuery usando a consulta.

  6. Percorra a coleção recebida.

O exemplo a seguir mostra como monitorar a inserção e a remoção de discos de uma unidade de disquete em um computador local. O script solicita instâncias ___InstanceModificationEvent para a instância da unidade de disquete Win32_LogicalDisk e sonda novas instâncias a cada 10 segundos. Esse script é um exemplo de um consumidor de evento temporário e continua em execução até que seja interrompido no Gerenciador de Tarefas ou até que o sistema seja reinicializado. Para obter mais informações, consulte Receber eventos pela duração do seu aplicativo.

Const FLOPPY_DISK = 2
Set colMonitoredDisks = GetObject("Winmgmts:").ExecNotificationQuery _
    ("Select * from __InstanceModificationEvent within 10 WHERE " _
        & "TargetInstance ISA 'Win32_LogicalDisk'")
i = 0
Do While i = 0
    Set strDiskChange = colMonitoredDisks.NextEvent
    If strDiskChange.TargetInstance.DriveType = FLOPPY_DISK Then
        If strDiskChange.TargetInstance.Size > 0 Then
            Wscript.Echo "A disk has been inserted" & _
                " into the floppy drive."
    Else
            Wscript.Echo "A disk has been removed" & _
                " from the floppy drive."
        End If
    End If
Loop

O procedimento a seguir descreve como receber notificação de evento semissíncrono usando C++.

Para receber notificação de evento semissíncrono no C++

  1. Configure o aplicativo com chamadas para as funções CoInitializeEx e CoInitializeSecurity.

    Como o WMI é baseado em COM, chamar CoInitializeEx e CoInitializeSecurity é uma etapa necessária para um aplicativo WMI. Para obter mais informações, consulte Criar um aplicativo ou script WMI.

  2. Determine o tipo de eventos que você deseja receber.

    O WMI dá suporte a eventos intrínsecos e extrínsecos. Um evento intrínseco é um evento predefinido pelo WMI. Um evento extrínseco é um evento definido por um provedor terceirizado. Para obter mais informações, consulte Determinar o tipo de evento a receber.

  3. Registre-se para receber uma classe específica de eventos com uma chamada para o método IWbemServices::ExecNotificationQuery.

    Torne cada consulta muito específica. A meta do registro é registrar-se para receber apenas as notificações necessárias. Notificações que não são necessárias para processamento de resíduos e tempo de entrega.

    Você pode criar um consumidor de eventos para receber vários eventos. Por exemplo, um consumidor pode exigir notificação de eventos de modificação de instância para uma classe específica de eventos de violação de dispositivo e segurança. Nesse caso, as tarefas que um consumidor executa ao receber um evento de modificação de instância são diferentes para os dois eventos. Assim, o consumidor deve fazer uma chamada para IWbemServices::ExecNotificationQuery para se registrar em eventos de modificação de instância e outra chamada para ExecNotificationQuery para se registrar em eventos de violação de segurança.

    Na chamada para ExecNotificationQuery, defina o parâmetro lFlags como WBEM_FLAG_RETURN_IMMEDIATELY e WBEM_FLAG_FORWARD_ONLY. O sinalizador WBEM_FLAG_RETURN_IMMEDIATELY solicita processamento semissíncrono e o sinalizador WBEM_FLAG_FORWARD_ONLY solicita um enumerador somente de encaminhamento. Para obter mais informações, consulte Chamar um método. A função ExecNotificationQuery retorna um ponteiro para uma interface IEnumWbemClassObject.

  4. Sondar notificações de eventos registrados fazendo chamadas repetidas para o método IEnumWbemClassObject::Next.

  5. Quando terminar, libere o enumerador que aponta para o objeto IEnumWbemClassObject.

    Você pode liberar o ponteiro IWbemServices associado ao registro. A liberação do ponteiro IWbemServices faz com que o WMI pare de fornecer eventos a todos os consumidores temporários associados.