次の方法で共有


WMI への呼び出しを行う

プロバイダーは、メソッド実装内から 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に設定する必要があります。

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

WMI プロバイダー の開発

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

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