WMI を呼び出す
プロバイダーは、WMI によって実装されたメソッドを、そのメソッド実装内から呼び出すことができます。 ただし、プロバイダーが同じメソッドの独自の実装内から IWbemServices メソッドの WMI 実装を呼び出す場合は、特別な考慮事項があります。 これらの考慮事項は、プロバイダーがメソッドの同期と非同期のどちらのバージョンを呼び出すかに関係なく重要です。
プロバイダーが実装できる各 IWbemServices メソッドには、pCtx パラメーター (IWbemContext インターフェイス実装へのポインター) があります。 WMI がプロバイダーを呼び出すと、WMI は有効なポインターをこのパラメーターで渡します。 プロバイダーは、要求の処理中に行う WMI の呼び出しでは、常にこの同じポインターを渡す必要があります。 pCtx を適切に設定しないと、WMI が無限ループを開始する可能性があります。
次のコード例は、GetObjectAsync の実装内から GetObject の WMI 実装を呼び出す正しい方法を示しています。
STDMETHODIMP CClassProv::GetObjectAsync (BSTR ObjectPath,
long lFlags, IWbemContext *pCtx,
IWbemObjectSink *pHandler)
{
IWbemClassObject *pclObj = NULL;
IWbemServices* m_pNamespace;
HRESULT hr = m_pNamespace->GetObject(
_bstr_t(L"AClass"), 0, pCtx, &pclObj,
NULL );
pclObj->Release();
return pHandler->SetStatus(0, hr, NULL, NULL);
}
このトピックの C++ コード例を正しくコンパイルするには、次の参照と #include ステートメントが必要です。
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
インスタンス、クラス、プロパティのプロバイダーは、読み取り要求の処理中にデータの変更を要求する WMI の呼び出しを発行してはなりません。 このルールの例外となるプロバイダーは、プッシュ プロバイダーだけです。 プッシュ プロバイダーは、WMI リポジトリにデータを格納し、WMI を利用してクライアントからの要求を処理するクラス プロバイダーです。 読み取り要求を処理するときに、プッシュ プロバイダーは WMI リポジトリを更新できますが、適切な IWbemServices 呼び出しで lFlags パラメーターを WBEM_FLAG_OWNER_UPDATE に設定する必要があります。
イベント プロバイダーは、呼び出しの処理中にクラスの変更を行ってはなりません。 イベント フィルターの変更など、イベント関連の呼び出しを発行することもできません。
関連トピック