次の方法で共有


同期イベント通知と半同期イベント通知の受け取り

既存のすべてのイベントを要求するには、SWbemServices.ExecQuery を使用します。

次のコード例は、ログ内のイベントについてクエリを実行する方法を示しています。

Select * from Win32_NTLogEvent

詳細については、「受信するイベントの種類の決定」、「イベント通知の受信」、および「WQL (WMI 用の SQL)」を参照してください。

SWbemServices.ExecNotificationQuery の既定の呼び出しでは、半同期通信が使用されます。 iflags パラメーターには、wbemFlagForwardOnly フラグと wbemFlagReturnImmediately フラグが既定で設定されています。 詳細については、「メソッドの呼び出し」を参照してください。

次の手順では、VBScript を使用して半同期イベント通知を受信する方法について説明します。

VBScript で半同期イベント通知を受信するには

  1. 受信したいイベントの種類に関するクエリを作成します。 詳細については、「受信するイベントの種類の決定」を参照してください。

  2. __InstanceCreationEvent などのイベントのインスタンスの種類を要求する場合は、クエリの中でターゲット インスタンスの種類 (たとえば、Win32_LogicalDisk) を指定します。

  3. 必要であれば、名前空間の名前などのインスタンスを、特定の名前空間の将来の __NamespaceModificationEvent インスタンスを要求するときに、指定します。

  4. Windows Management Instrumentation (WMI) のポーリング間隔をクエリで、10 秒ごとにポーリングする場合は "WITHIN 10" のように指定します。 詳細については、WITHIN 句に関する説明を参照してください。

  5. SWbemServices.ExecNotificationQuery を、クエリを使用して呼び出します。

  6. 受け取ったコレクションをループします。

次の例は、ローカル コンピューター上のフロッピー ディスク ドライブからのディスクの挿入と取外しを監視する方法を示しています。 このスクリプトは、フロッピー ドライブ Win32_LogicalDisk インスタンスの ___InstanceModificationEvent インスタンスを要求し、新しいインスタンスについて 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. CoInitializeEx 関数と CoInitializeSecurity 関数の呼び出しを使用してアプリケーションを設定します。

    WMI は COM ベースであるため、CoInitializeExCoInitializeSecurity の呼び出しが WMI アプリケーションに必要な手順です。 詳細については、「WMI アプリケーションまたはスクリプトの作成」を参照してください。

  2. 受け取りたいイベントの種類を決めます。

    WMI では、組み込みイベントと非組み込みイベントがサポートされています。 組み込みイベントとは、WMI によって事前定義されたイベントです。 非組み込みイベントとは、サード パーティのプロバイダーによって定義されたイベントです。 詳細については、「受信するイベントの種類の決定」を参照してください。

  3. 特定のイベントのクラスを受け取りを、IWbemServices::ExecNotificationQuery メソッドの呼び出しで登録します。

    それぞれのクエリを、非常に具体的にします。 登録の目的は、必要な通知だけを受け取るように登録することです。 必要のない通知は、処理と配信の時間を浪費します。

    複数のイベントを受信するようにイベント コンシューマーを設計できます。 たとえば、特定のクラスのデバイスおよびセキュリティ違反イベントのインスタンス変更イベントの通知をコンシューマーが必要とする場合があります。 この場合、インスタンス変更イベントを受け取るときにコンシューマーが実行するタスクは、2 つのイベントで異なります。 したがって、コンシューマーはインスタンス変更イベントの登録で IWbemServices::ExecNotificationQuery を 1 回呼び出し、もう 1 つの ExecNotificationQuery の呼び出しでセキュリティ違反イベントを登録する必要があります。

    ExecNotificationQuery の呼び出しで、lFlags パラメーターを WBEM_FLAG_RETURN_IMMEDIATELY および WBEM_FLAG_FORWARD_ONLY に設定します。 WBEM_FLAG_RETURN_IMMEDIATELY フラグは半同期処理を要求し、WBEM_FLAG_FORWARD_ONLY フラグは順方向専用列挙子を要求します。 詳細については、「メソッドの呼び出し」を参照してください。 ExecNotificationQuery 関数は、IEnumWbemClassObject インターフェイスへのポインターを返します。

  4. IEnumWbemClassObject::Next メソッドを繰り返し呼び出して、登録されたイベント通知をポーリングします。

  5. 完了したら、IEnumWbemClassObject オブジェクトを指す列挙子を解放します。

    登録に関連付けられている IWbemServices ポインターを解放できます。 IWbemServices ポインターを解放することで、関連付けられているすべての一時コンシューマーへのイベントの配信を WMI が停止します。