プロバイダーは、メソッド実装内から WMI によって実装されたメソッドを呼び出すことができます。 ただし、プロバイダーが同じメソッドの独自の実装内から IWbemServices メソッドの WMI 実装を呼び出す場合は、特別な考慮事項があります。 これらの考慮事項は、プロバイダーがメソッドの同期バージョンと非同期バージョンのどちらを呼び出すかに関係なく重要です。
プロバイダーが実装できる各 IWbemServices メソッドには、iWbemContext インターフェイス実装へのポインターである pCtx パラメーターがあります。 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に設定する必要があります。
イベント プロバイダーは、呼び出しの処理中にクラスを変更してはなりません。 また、イベント フィルターの変更など、イベント関連の呼び出しを発行することもできません。
関連トピック