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 に設定する必要があります。

イベント プロバイダーは、呼び出しの処理中にクラスの変更を行ってはなりません。 イベント フィルターの変更など、イベント関連の呼び出しを発行することもできません。

WMI プロバイダーの開発

名前空間セキュリティ記述子の設定

プロバイダーのセキュリティ保護