次の方法で共有


IWbemServices::CreateClassEnumAsync メソッド (wbemcli.h)

IWbemServices::CreateClassEnumAsync メソッドは、クラス プロバイダーがサポートするすべてのクラスの列挙を返します。 クラス プロバイダーは、各クラス定義を最初から作成し、要求されたクラスのサブクラスのみを返します。 非同期メソッドとして、 CreateClassEnumAsync はステータス メッセージを直ちに返し、必要に応じて pResponseHandler パラメーターを介して渡されたシンクを更新します。

呼び出しが成功すると、WMI はポインター pResponseHandlerAddRef を呼び出し、すぐにを返し、その後 pResponseHandler を非同期的に呼び出します。>クエリが満たされるまで、クラス定義を持つ別のスレッドからを示します。

構文

HRESULT CreateClassEnumAsync(
  [in] const BSTR      strSuperclass,
  [in] long            lFlags,
  [in] IWbemContext    *pCtx,
  [in] IWbemObjectSink *pResponseHandler
);

パラメーター

[in] strSuperclass

NULL または空白でない場合、このパラメーターは親クラス名を指定します。 列挙子では、このクラスのサブクラスであるクラスのみが返されます。 NULL または空白で、lFlagsWBEM_FLAG_SHALLOW場合は、最上位クラス (親クラスを持たないクラス) のみが返されます。 NULL または空白で、lFlagsWBEM_FLAG_DEEP場合は、名前空間内のすべてのクラスが返されます。

[in] lFlags

次の値のうち 1 つ以上が有効です。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

このフラグが設定されている場合、Windows Management Instrumentation (WMI) は、現在の接続ロケールのローカライズされた名前空間に格納されている修正された修飾子を取得します。 設定されていない場合は、イミディエイト名前空間に格納されている修飾子のみが取得されます。

WBEM_FLAG_BIDIRECTIONAL

このフラグにより、クライアントが列挙子を解放するまで、WMI は列挙のオブジェクトへのポインターを保持します。

WBEM_FLAG_DEEP

このフラグは、列挙体に、このサブクラスとすべてのサブクラスを階層内に強制的に含めます。

WBEM_FLAG_SHALLOW

このフラグは、このクラスに見つからないプロパティを提供するサブクラスのすべてのインスタンスを除き、このクラスの純粋なインスタンスのみを列挙に強制的に含めます。

WBEM_FLAG_SEND_STATUS

このフラグは、 IWbemObjectSink::SetStatus のクライアント実装を通じて中間状態レポートを受信する要求を WMI に登録します。 プロバイダーの実装では、このフラグが動作を変更するための中間状態レポートをサポートする必要があります。

メモstrSuperclassNULL または空白で、WBEM_FLAG_DEEPが指定されている場合は、すべてのクラスが返されます。
 

[in] pCtx

通常 は NULL です。 それ以外の場合、これは、要求されたクラスを返すプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。 コンテキスト オブジェクトの値は、プロバイダーのドキュメントで指定する必要があります。 このパラメーターの詳細については、「 WMI への呼び出しの作成」を参照してください。

[in] pResponseHandler

IWbemObjectSink の呼び出し元の実装へのポインター。 このハンドラーは、 IWbemObjectSink::Indicate メソッドを使用して、使用可能になったときにオブジェクトを受け取ります。 使用可能なオブジェクトがない場合、 IWbemObjectSink::SetStatus メソッドは WMI によって呼び出されます。 エラー コードが返された場合、指定された IWbemObjectSink ポインターは使用されません。 WBEM_S_NO_ERRORが返された場合は、操作の結果を示すためにユーザー IWbemObjectSink 実装が呼び出されます。 WMI は、WBEM_S_NO_ERRORが返された場合にのみポインターに対して AddRef を呼び出します。 エラー コードが返されると、参照カウントはエントリなしと同じです。 このパラメーターの詳細については、「 メソッドの呼び出し」を参照してください。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。 失敗した場合は、COM 関数 GetErrorInfo から使用可能な情報を取得できます。 ネットワークの問題によって WMI へのリモート接続が失われると、COM 固有のエラー コードが返される可能性があります。 CreateClassEnumAsync がWBEM_S_NO_ERRORを返した場合、WMI は応答ハンドラーの SetStatus メソッドからの結果を待機します。 WMI は、ローカル接続で無期限に待機するか、リモート接続のタイムアウトが発生するまで待機します。 次の一覧は、 HRESULT 内に含まれる値の一覧です。

解説

コールバックはクライアントが必要とするのと同じ認証レベルで返されない可能性があるため、非同期通信の代わりに半同期を使用することをお勧めします。 非同期通信が必要な場合は、「 メソッドの呼び出し」を参照してください。

メソッドを半同期的に使用する方法の詳細については、「 IWbemServices::CreateClassEnum 」および「 メソッドの呼び出し」を参照してください。

次のコード例は、 CreateClassEnumAsync を実装する方法を示しています。

HRESULT CStdProvider::CreateClassEnumAsync( 
            /* [in] */ BSTR strSuperclass,
            /* [in] */ long lFlags,
            /* [in] */ IWbemContext __RPC_FAR *pCtx,
            /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
            )
{
    IWbemClassObject *pClass = 0;

    // Assume there is an IWbemServices pointer available (m_pSvc).
    // Retrieve an 'empty' object that will be built up
    // into the class definition.
    
    HRESULT hRes = m_pSvc->GetObject(NULL, 0, NULL, &pClass, 0);
    if (hRes)
    {
        return hRes;
    }

    // Prepare an empty object to receive the class definition.
        IWbemClassObject *pNextClass = 0;
        hRes = pClass->Clone(&pNextClass);

    // Now loop through the private source of class definitions
    // and create each class.
    while(hRes)
    {
        // Create the class definition elsewhere.
        // For example, call a function that creates a definition:
        // FillClassDef(pNextClass);

        // Deliver the class to WMI.
        pResponseHandler->Indicate(1, &pNextClass);
        pNextClass->Release( );

        // Prepare an empty object to receive the class definition.
        IWbemClassObject *pNextClass = 0;
        hRes = pClass->Clone(&pNextClass);     
    }

    pClass->Release();

    // Send a finish message to WMI.

    pResponseHandler->SetStatus(0, hRes, 0, 0);

    return hRes;
}

前の例では、クラス プロバイダーは WMI からスレッドを取得して、必要な操作を実行します。 シンクの AddRef メソッドを呼び出し、結果セット内のオブジェクトを配信する別のスレッドを作成できます。 別のスレッドを作成すると、現在のスレッドは、スレッド プールを使い果たさずに WMI に戻ることができます。 プロバイダーが単一スレッド設計を選択するか、デュアル スレッド設計を選択するかは、プロバイダーが WMI スレッドを使用する予定の時間によって異なります。 固定ルールはありません。 実験は、設計が WMI のパフォーマンスにどのように影響するかを判断するのに役立ちます。

要件

   
サポートされている最小のクライアント Windows Vista
サポートされている最小のサーバー Windows Server 2008
対象プラットフォーム Windows
ヘッダー wbemcli.h (Wbemidl.h を含む)
Library Wbemuuid.lib
[DLL] Fastprox.dll;Esscli.dll;FrameDyn.dll;FrameDynOS.dll;Ntevt.dll;Stdprov.dll;Viewprov.dll;Wbemcomn.dll;Wbemcore.dll;Wbemess.dll;Wbemsvc.dll;Wmipicmp.dll。Wmidcprv.dll;Wmipjobj.dll。Wmiprvsd.dll

関連項目

メソッドの呼び出し

IWbemObjectSink

IWbemServices

IWbemServices::CreateClassEnum

エラー コードの取得