IWbemUnboundObjectSink
COM公式ドキュメント
IWbemUnboundObjectSink インターフェイスは、すべての論理イベントコンシューマーによって実装されます。イベントオブジェクトの配信を受け取るだけのシンプルなシンクインターフェイスです。
メソッド 1
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
実際にイベントをコンシューマーへ配信するために WMI から呼び出されます。
| pLogicalConsumer | IWbemClassObject* | in | この一連のオブジェクトの配信先となる論理コンシューマーオブジェクトへのポインター。 |
| lNumObjects | INT | in | 後続の配列で配信されるオブジェクトの数。 |
| apObjects | IWbemClassObject** | in | 配信されるイベントを表す IWbemClassObject インスタンスの配列へのポインター。配列内の各オブジェクトはそれぞれ個別のイベントに対応するため、 IndicateToConsumer の実装では各オブジェクトを個別に扱う必要があります。 |
戻り値
成功した場合、このメソッドは WBEM_S_NO_ERROR を返します。それ以外の場合、実装は適切なエラーコードを返す必要があります。
解説(Remarks)
WMI は通常、特定の論理コンシューマーに対する IWbemUnboundObjectSink ポインターを、 IWbemEventConsumerProvider インターフェイスを実装するイベントコンシューマープロバイダーから取得します。その後、Windows Management が IndicateToConsumer を呼び出して実際のイベントオブジェクトを配信します。
IndicateToConsumer のほとんどの実装は、通知が非同期であることを前提としています。同期通知をサポートするには、シンクは 20 ミリ秒未満でイベント処理を完了する必要があります。同期通知をサポートする非常に高速なイベントコンシューマープロバイダーは、 IndicateToConsumer 内で IWbemClassObject インターフェイスへのポインターを保持したり、ポインターの参照カウントをインクリメントしたりしてはなりません。IndicateToConsumer の呼び出しの有効期間を超えて IWbemClassObject で定義されるクラスオブジェクトが必要な場合は、そのオブジェクトのコピーを作成してください。ただし、IWbemClassObject ポインターが指す情報へ長期的にアクセスする必要がある場合は、イベントコンシューマープロバイダーが同期通知をサポートしないことをお勧めします。イベントコンシューマープロバイダーは、登録の完了時にサポートする通知の種類を示します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWbemUnboundObjectSink "{E246107B-B06E-11D0-AD61-00C04FD8FDFF}"
#usecom global IWbemUnboundObjectSink IID_IWbemUnboundObjectSink "{}"
#comfunc global IWbemUnboundObjectSink_IndicateToConsumer 3 sptr,int,sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。