Ricezione di notifiche degli eventi sincrone e semiincrone
Usare SWbemServices.ExecQuery per richiedere tutti gli eventi esistenti.
Nell'esempio di codice seguente viene illustrato come eseguire una query per gli eventi in un log.
Select * from Win32_NTLogEvent
Per altre informazioni, vedere Determinare il tipo di evento da ricevere, ricezione di notifiche degli eventie WQL (SQL per WMI).
La chiamata predefinita a SWbemServices.ExecNotificationQuery usa la comunicazione semisincrona. Il parametro iflags include i flag wbemFlagForwardOnly e wbemFlagReturnImmediately impostati per impostazione predefinita. Per ulteriori informazioni, vedere Richiamare un metodo.
La procedura seguente descrive come ricevere una notifica degli eventi semisynchrono usando VBScript.
Per ricevere la notifica degli eventi semiscroni in VBScript
Creare una query per il tipo di evento che si desidera ricevere. Per altre informazioni, vedere Determinare il tipo di evento da ricevere.
Se si richiede un tipo di istanza di evento, ad esempio __InstanceCreationEvent, indicare nella query un tipo di istanza di destinazione, ad esempio Win32_LogicalDisk.
Se necessario, specificare un'istanza, ad esempio, il nome di uno spazio dei nomi quando si richiedono istanze future __NamespaceModificationEvent per uno spazio dei nomi specifico.
Specificare un intervallo di polling per la Strumentazione di gestione Windows (WMI) in una query, ad esempio "WITHIN 10", per eseguire il polling ogni 10 secondi. Per ulteriori informazioni, vedere clausolaall'interno.
Chiamare SWbemServices.ExecNotificationQuery utilizzando la query.
Scorrere la raccolta ricevuta.
Nell'esempio seguente viene illustrato come monitorare l'inserimento e la rimozione di dischi da un'unità disco floppy in un computer locale. Lo script richiede ___InstanceModificationEvent istanze per l'unità floppy Win32_LogicalDisk istanza ed esegue il polling ogni 10 secondi per verificare nuove istanze. Questo script è un esempio di consumatore di eventi temporaneo e continua l'esecuzione fino a quando non viene arrestato in Gestione Attività o il sistema viene riavviato. Per ulteriori informazioni, consultare Ricezione di eventi durante la durata dell'applicazione.
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
La procedura seguente descrive come ricevere una notifica degli eventi semisynchrono usando C++.
Per ricevere una notifica degli eventi semisincrona in C++
Configurare l'applicazione con chiamate alle funzioniCoInitializeExe CoInitializeSecurity.
Poiché WMI è basato su COM, la chiamata CoInitializeEx e CoInitializeSecurity è un passaggio obbligatorio per un'applicazione WMI. Per altre informazioni, vedere Creazione di un'applicazione WMI o script.
Determinare il tipo di eventi che si desidera ricevere.
WMI supporta eventi intrinseci ed estrini. Un evento intrinseco è un evento predefinito da WMI. Un evento estrinsico è un evento definito da un provider di terze parti. Per altre informazioni, vedere Determinare il tipo di evento da ricevere.
Registra per ricevere una classe specifica di eventi con una chiamata al metodo IWbemServices::ExecNotificationQuery.
Rendere ogni interrogazione molto specifica. L'obiettivo della registrazione è registrare per ricevere solo le notifiche necessarie. Le notifiche non necessarie fanno perdere tempo nell'elaborazione e nella consegna.
È possibile progettare un consumer di eventi per ricevere più eventi. Ad esempio, un consumer potrebbe richiedere la notifica di eventi di modifica dell'istanza per una classe specifica di eventi di violazione del dispositivo e della sicurezza. In questo caso, le attività eseguite da un consumer durante la ricezione di un evento di modifica dell'istanza sono diverse per i due eventi. Pertanto, il consumer deve effettuare una chiamata a IWbemServices::ExecNotificationQuery per eseguire la registrazione per gli eventi di modifica dell'istanza e un'altra chiamata a ExecNotificationQuery per la registrazione per gli eventi di violazione della sicurezza.
Nella chiamata a ExecNotificationQueryimpostare il parametro lFlags su WBEM_FLAG_RETURN_IMMEDIATELY e WBEM_FLAG_FORWARD_ONLY. Il flag WBEM_FLAG_RETURN_IMMEDIATELY richiede l'elaborazione semisincrona e il flag WBEM_FLAG_FORWARD_ONLY richiede un enumeratore forward-only. Per altre informazioni, vedere Chiamata di un metodo. La funzione ExecNotificationQuery restituisce un puntatore a un'interfaccia IEnumWbemClassObject.
Eseguire il polling delle notifiche degli eventi registrati effettuando chiamate ripetute al metodo IEnumWbemClassObject::Next.
Al termine, rilasciare l'enumeratore che punta all'oggetto IEnumWbemClassObject.
È possibile rilasciare il puntatore IWbemServices associato alla registrazione. Il rilascio del puntatore IWbemServices interrompe il recapito di eventi a tutti i consumer temporanei associati.