共用方式為


接收同步和半同步事件通知

使用 SWbemServices.ExecQuery 來要求所有現有的事件。

下列程式代碼範例示範如何查詢記錄檔中的事件。

Select * from Win32_NTLogEvent

如需詳細資訊,請參閱 判斷接收的事件類型、接收事件通知,以及 WQL (適用於 WMI 的 SQL)

SWbemServices.ExecNotificationQuery 的預設呼叫會使用半同步通訊。 iflags 參數預設具有 wbemFlagForwardOnlywbemFlagReturnImmediately 旗標。 如需詳細資訊,請參閱 呼叫 方法

下列程式描述如何使用 VBScript 接收半同步事件通知。

在 VBScript 中接收半同步事件通知

  1. 建立您希望接收的事件類型的查詢。 如需詳細資訊,請參閱 判斷要接收的事件類型

  2. 如果您要求實體類型的事件,例如 __InstanceCreationEvent,請在查詢中指出目標實例的類型,例如,Win32_LogicalDisk

  3. 如有必要,請在要求特定命名空間的未來 __NamespaceModificationEvent 實例時,指定命名空間的名稱。

  4. 在查詢中指定 Windows Management Instrumentation (WMI) 的輪詢間隔,例如“WITHIN 10”,每 10 秒輪詢一次。 如需詳細資訊,請參閱 WITHIN 子句

  5. 呼叫 SWbemServices.ExecNotificationQuery 使用此查詢。

  6. 迴圈查看您收到的集合。

下列範例示範如何監視本機上的軟碟機中磁碟的插入和移除。 腳本會要求 ___InstanceModificationEvent 磁碟驅動器實例 Win32_LogicalDisk 實例,並每隔 10 秒輪詢新的實例。 此腳本是暫存事件取用者的範例,並且會繼續執行,直到工作管理員中停止或系統重新啟動為止。 如需詳細資訊,請參閱 應用程式期間的接收事件。

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

下列程式描述如何使用 C++ 接收半同步事件通知。

若要在 C++ 中接收半同步事件通知

  1. 使用對 CoInitializeExCoInitializeSecurity 函式的呼叫來設定應用程式。

    因為 WMI 是以 COM 為基礎,因此呼叫 CoInitializeExCoInitializeSecurity 是 WMI 應用程式的必要步驟。 如需詳細資訊,請參閱 建立 WMI 應用程式或文稿

  2. 判斷您想要接收的事件種類。

    WMI 支援內部和外部事件。 內部事件是由 WMI 預先定義的事件。 外部事件是由第三方提供者所定義的事件。 如需詳細資訊,請參閱 判斷要接收的事件類型

  3. 使用呼叫 IWbemServices::ExecNotificationQuery 方法來註冊以接收特定類別的事件。

    讓每個查詢變得非常具體。 註冊的目標是只註冊以接收必要的通知。 不必要的通知會浪費處理和傳遞時間。

    您可以設計事件消費者來接收多個事件。 例如,消費者可能需要有關某特定設備類別的實例和安全違規事件的修改通知。 在此情況下,消費者在收到實例修改事件時所執行的任務,會因為這兩個事件而有所不同。 因此,使用者應該呼叫 IWbemServices::ExecNotificationQuery 來註冊實例修改事件,然後再呼叫 ExecNotificationQuery 以註冊安全性違規事件。

    在呼叫 ExecNotificationQuery時,將 lFlags 參數設定為 WBEM_FLAG_RETURN_IMMEDIATELYWBEM_FLAG_FORWARD_ONLYWBEM_FLAG_RETURN_IMMEDIATELY 旗標會要求半同步的處理,而 WBEM_FLAG_FORWARD_ONLY 旗標會要求一個正向枚舉器。 如需詳細資訊,請參閱 呼叫 方法ExecNotificationQuery 函式會傳回 IEnumWbemClassObject 介面的指標。

  4. IEnumWbemClassObject::Next 方法進行重複呼叫,以輪詢已註冊的事件通知。

  5. 完成後,釋放指向 IEnumWbemClassObject 物件的列舉器。

    您可以釋放與註冊相關聯的 IWbemServices 指標。 釋放 IWbemServices 指標會導致 WMI 停止傳遞事件給所有相關聯的臨時使用者。