次の方法で共有


IWbemProviderInit::Initialize メソッド (wbemprov.h)

IWbemProviderInit::Initialize メソッドは、クライアント要求を受信するプロバイダーを初期化するために Windows Management によって呼び出されます。 すべての種類のプロバイダーがこのメソッドを実装する必要があります。

構文

HRESULT Initialize(
  [in] LPWSTR                wszUser,
  [in] LONG                  lFlags,
  [in] LPWSTR                wszNamespace,
  [in] LPWSTR                wszLocale,
  [in] IWbemServices         *pNamespace,
  [in] IWbemContext          *pCtx,
  [in] IWbemProviderInitSink *pInitSink
);

パラメーター

[in] wszUser

このプロバイダーの __Win32Provider 登録インスタンスでユーザーごとの初期化が要求された場合は、ユーザー名へのポインター。 それ以外の場合、これは NULL です

このパラメーターは、プロバイダーの __Win32Provider インスタンスの PerUserInitialization プロパティの値に関係なく、イベント コンシューマー プロバイダーの場合は NULL に設定されていることに注意してください。

[in] lFlags

予約済み。 このパラメーターは 0 (ゼロ) である必要があります。

[in] wszNamespace

プロバイダーが初期化される名前空間名。

[in] wszLocale

プロバイダーが初期化されているロケール名。

16 進値が Microsoft 標準 LCID 値である、次の形式の文字列。

  • "MS_409"
このパラメーターは NULL である可能性があります。

[in] pNamespace

Windows Management に戻る IWbemServices ポインター。 このポインターは、プロバイダーによって行われた要求を処理できます。 プロバイダーは、実行中に Windows Management にコールバックする場合は、このポインターで IWbemProviderInit::AddRef メソッドを使用する必要があります。

[in] pCtx

初期化に関連付けられている IWbemContext ポインター。 このパラメーターは NULL である可能性があります。

初期化を完了する前にプロバイダーが Windows Management に要求を実行する場合は、このポインターで IWbemProviderInit::AddRef メソッドを使用する必要があります。 詳細については、「WMI を呼び出す」を参照してください。

プロバイダーが別のプロバイダーに依存する要求を行う必要がある場合は、ロックアップの可能性を回避するために、このコンテキスト文字列を WMI に渡す必要があります。 ただし、独立した要求の場合、これは不要であり、WMI によって新しいコンテキスト文字列が生成されます。

[in] pInitSink

初期化状態を報告するためにプロバイダーによって使用される IWbemProviderInitSink ポインター。

戻り値

プロバイダーは WBEM_S_NO_ERROR を返し、 pInitSink パラメーターで指定されたオブジェクト シンクを使用してその状態を示す必要があります。 ただし、プロバイダーが WBEM_E_FAILED を返し、シンクを使用しない場合、プロバイダーの初期化は失敗したと見なされます。

注釈

通常、プロバイダーは複数の継承を使用して COM オブジェクトを実装し、 IWbemProviderInit インターフェイスと、 IWbemServicesIWbemEventProvider などのプライマリ インターフェイスの両方をサポートします。

初期化状態は、 IWbemProviderInitSink::SetStatus を呼び出すことによって報告されます。 このメソッドは、必要に応じて増分状態を報告するために繰り返し呼び出すことができます。 プロバイダーは、 IWbemProviderInit::AddRef メソッドを呼び出してこのポインターの参照カウントをインクリメントする必要があります。その前に、そのメソッドを使用して状態を Windows Management に伝達する必要があります。

プロバイダーは、次のコード例のように、 IWbemProviderInitSink ポインターを同期的に使用できます。

HRESULT SampleProvider::Initialize( 
    /* [unique][in] */  LPWSTR wszUser,
    /* [in] */          LONG lFlags,
    /* [in] */          LPWSTR wszNamespace,
    /* [unique][in] */  LPWSTR wszLocale,
    /* [in] */          IWbemServices __RPC_FAR *pNamespace,
    /* [in] */          IWbemContext __RPC_FAR *pCtx,
    /* [in] */          IWbemProviderInitSink __RPC_FAR *pInitSink
    )
{
    // Use AddRef on the pNamespace pointer, if required.

    // Analyze other parameters.

    // Tell Windows Management that you are initialized.
    pInitSink->SetStatus(WBEM_S_INITIALIZED, 0);
    return WBEM_S_NO_ERROR;
}

プロバイダーは、ポインターで AddRef メソッドを使用し、別のスレッドを作成して初期化を完了し、すぐに呼び出しから戻ることもできます。

一部のプロバイダーの初期化プロセスには、WMI への呼び出しが含まれる場合があります。 WMI にコールバックし、その呼び出しが完了するまで待機する必要があるプロバイダーは、依存プロバイダーと呼ばれます。 同様に、WMI への呼び出しは依存要求と呼ばれます。 Initialize を実装する場合、WMI では依存プロバイダーが次の規則に従う必要があります。

  • 依存要求では、WMI が Initialize に渡した IWbemContext ポインターを再利用する必要があります。

    つまり、初期化中に行われた WMI への呼び出しでは、WMI が渡した IWbemContext ポインターを再利用する必要があります。 これを行わないと、デッドロックが発生する可能性があります。

  • 非依存要求では、 IWbemContext ポインターを再利用することはできません。
  • 依存プロバイダーは、次の 2 つの方法のいずれかを使用して WMI に要求を行う必要があります。
    1. WMI から受信したスレッドで依存要求を行います。
    2. プロバイダーによって作成された新しいスレッドで依存要求を行います。
  • すべてのプロバイダーは、WMI から受信したスレッドを返す必要があります。
  • WMI では、WMI から受信したスレッドをプロバイダーがブロックできません。

    WMI によって配信されるスレッドを慎重に処理しない危険性は、プロバイダーが WMI スレッド プール内のすべてのスレッドを取得し、それらのスレッドをブロックし続ける可能性があるということです。 これにより、デッドロックされたシステムが発生します。

プロバイダーをインプロセスで実装することもできます。 初期化プロセスとは別に WMI に接続する必要があるインプロセス プロバイダーは、CLSID_WbemAdministrativeLocator クラス識別子を使用して、CoCreateInstance の呼び出しで IWbemLocator にアクセスする必要があります。

次のコード例では、このような呼び出しで CLSID_WbemAdministrativeLocator 識別子を使用する方法について説明します。

  IWbemLocator *pLoc = 0;

  DWORD dwRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, 0, 
      CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);

CLSID_WbemAdministrativeLocator識別子を使用しないと、アクセス拒否エラーが発生します。 WMI への接続の詳細については、「WMI アプリケーションまたはスクリプトの作成」を参照してください。

次のコード例では、イベント コンシューマー プロバイダーに対して Initialize を実装する方法について説明します。

HRESULT CMyEventConsumer::Initialize( 
    /* [in] */ LPWSTR pszUser,
    /* [in] */ LONG lFlags,
    /* [in] */ LPWSTR pszNamespace,
    /* [in] */ LPWSTR pszLocale,
    /* [in] */ IWbemServices __RPC_FAR *pNamespace,
    /* [in] */ IWbemContext __RPC_FAR *pCtx,
    /* [in] */ IWbemProviderInitSink __RPC_FAR *pInitSink
    )
{
    pInitSink->SetStatus(WBEM_S_INITIALIZED, 0);

// Optionally, examine the namespace, locale, and so on 
// being used.

    return WBEM_S_NO_ERROR;
}

要件

要件
サポートされている最小のクライアント Windows Vista
サポートされている最小のサーバー Windows Server 2008
対象プラットフォーム Windows
ヘッダー wbemprov.h (Wbemidl.h を含む)
Library Wbemuuid.lib
[DLL] Wbemsvc.dll

関連項目

IWbemProviderInit

プロバイダーの初期化