IWbemEventConsumerProvider::FindConsumer メソッド (wbemprov.h)
FindConsumer 関数は、WMI がイベントを送信できるシンク オブジェクトを検索して返します。 WMI は論理コンシューマー オブジェクトへのポインターを渡し、 FindConsumer は論理コンシューマーに関連付けられている物理コンシューマーを検索します。 最後に、 FindConsumer は、物理コンシューマーに属するシンクへのポインターを WMI に返します。 WMI はシンクで AddRef を呼び出し、シンクに適切なイベントを配信し始めます。 WMI は、配信なしで構成可能な期間が経過した後にシンクを解放します。 必要に応じて、WMI は FindConsumer をもう一度呼び出してシンクを再度読み込むことができます。
構文
HRESULT FindConsumer(
[in] IWbemClassObject *pLogicalConsumer,
[out] IWbemUnboundObjectSink **ppConsumer
);
パラメーター
[in] pLogicalConsumer
イベント オブジェクトの配信先となる論理コンシューマー オブジェクトへのポインター。
[out] ppConsumer
イベント オブジェクト シンクを Windows Management に返します。 Windows Management は、このポインターに対して AddRef を呼び出し、論理コンシューマーに関連付けられているイベントをこのシンクに配信します。 最終的には、適切なタイムアウトの後、Windows Management はポインターに対して Release を呼び出します。
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。 次の一覧は、 HRESULT 内に含まれる値の一覧です。
注釈
Windows Management は、スキーマ内に登録されている論理コンシューマーに IWbemClassObject の形式でイベントを配信します。 コンシューマー プロバイダーは FindConsumer を実装し、イベントを論理コンシューマーに配信する必要がある場合は常に Windows Management にイベント シンクを提供します。
Windows Management は論理コンシューマー オブジェクトを認識し、イベント オブジェクトを配信する準備ができています。 イベント オブジェクトを配信するために、WMI は FindConsumer を呼び出します。 コンシューマー プロバイダーは、イベント シンク オブジェクト ( IWbemUnboundObjectSink へのポインター) を作成し、イベントを配信できるように Windows Management へのポインターを返す必要があります。
この手法を使用すると、1 つのイベント コンシューマー プロバイダーは、それぞれに異なる IWbemUnboundObjectSink ポインターを返すことによって、さまざまな論理コンシューマーへのイベントの配信を処理できます。
FindConsumer は、いくつかの方法で実装できます。
-
すべての論理コンシューマーに 1 つのシンクを提供します。
この方法は、1 つの COM オブジェクトのみがメモリに格納されるため、スペースの面で最も効率的です。 たとえば、ファイルにメッセージを記録する論理コンシューマー用のシンクを提供するイベント コンシューマー プロバイダーを考えてみましょう。単一のシンクは、各論理コンシューマーに含まれるデータを調べて続行する方法を決定する責任を負います。 ほとんどの場合、受信した各イベントには、ログ ファイルの開き、メッセージのログ記録、ファイルの閉じが含まれます。 空間の面では効率的ですが、この戦略にはかなりの処理時間が必要です。
-
論理コンシューマーごとに異なるシンクを指定します。
この方法では、イベントの発生時に専用のシンクでイベントを受け取る準備が整い、パフォーマンスが最適化されます。 この方法は、単一のシンクよりも高速ですが、メモリの面でコストがかかるため、効率は低くなります。 各シンクは独自のログ ファイルを保持するため、ファイルは常に開いて、イベントの発生時にメッセージをログに記録できます。 その後、WMI がタイムアウト後にシンクを解放すると、シンクはファイルを閉じることができ、高速配信シナリオと低速配信シナリオの両方で効率的なパフォーマンスを実現します。
-
論理コンシューマーをグループに分割し、グループごとに異なるシンクを提供します。
このアプローチは、パフォーマンスと効率の間で侵害されます。 ハイブリッド アプローチでは、ログに記録するメッセージの種類に関連付けられたログ ファイルをいくつか含めることができます。 複数の COM オブジェクトが複数の開いているファイルを処理します。 この方法を使用するイベント コンシューマー プロバイダーは、 FindConsumer 呼び出し中にログ ファイル名を読み取り、ファイルを開き、すべてのメッセージをこのファイルに記録するシンクを返します。 プロバイダーは、 Release メソッドの最後の呼び出しでファイルを閉じます。 この方法では、コンシューマーは使用するファイルに関する情報を正確に持つため、効率を維持します。コンシューマーは、新しいファイルを検索または開く必要はありません。 また、コンシューマーは、異なるメッセージを同じファイルに記録するシンクを組み合わせることでメモリを節約できます。
例
次のコード例では、 FindConsumer の実装について説明します。 次の実装では、イベントを受信するための 2 つのシンクが存在し、2 つの異なる登録済みイベント フィルターごとに 1 つ存在するとします。 どのシンク FindConsumer が WMI に返送するかを確認するために、このコードは受信論理コンシューマー オブジェクトを調べます。
HRESULT MyEventConsumerClass::FindConsumer(
/* [in] */ IWbemClassObject __RPC_FAR *pLogicalConsumer,
/* [out] */ IWbemUnboundObjectSink __RPC_FAR *__RPC_FAR *ppConsumer
)
{
// Examine the logical consumer to see which one it is.
// ====================================================
VARIANT v;
VariantInit(&v);
HRESULT hRes = WBEM_E_NOT_FOUND;
*ppConsumer = 0;
pLogicalConsumer->Get(_bstr_t(L"Name"), 0, &v, 0, 0);
// Decide which of the two logical consumers to send back.
// =======================================================
if (_wcsicmp(V_BSTR(&v), L"Consumer1") == 0)
{
//send back the Consumer1 sink to WMI
// For example:
/*hRes = m_pConsumer1->
QueryInterface(IID_IWbemUnboundObjectSink,
(LPVOID*)ppConsumer);*/
}
else if (_wcsicmp(V_BSTR(&v), L"Consumer2") == 0)
{
//send back the Consumer2 sink to WMI
// For example:
/*hRes = m_pConsumer2->
QueryInterface(IID_IWbemUnboundObjectSink,
(LPVOID*)ppConsumer);*/
}
VariantClear(&v);
return hRes;
}
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Vista |
サポートされている最小のサーバー | Windows Server 2008 |
対象プラットフォーム | Windows |
ヘッダー | wbemprov.h (Wbemidl.h を含む) |
Library | Wbemuuid.lib |
[DLL] | Wbemsvc.dll |