Win32 API 日本語リファレンス
ホームSystem.Wmi › IWbemServices

IWbemServices

COM
IID9556dc99-828c-11cf-a37e-00aa003240c7継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

WMI サービスにアクセスするために、クライアントおよびプロバイダーが使用します。このインターフェイスは WMI と WMI プロバイダーによって実装され、WMI の中心となるインターフェイスです。

解説(Remarks)

IWbemServices インターフェイスを実装するプロバイダーは、実装する各メソッドについて文書化されたセマンティクスに従う必要があります。また、プロバイダーは規定されたエラー戻りコードをサポートしなければなりません。WMI はすべてのメソッドを実装しますが、通常、各プロバイダーはこのインターフェイスで利用できる機能のごく一部だけを実装します。プロバイダーは、実装しないメソッドについては WBEM_E_PROVIDER_NOT_CAPABLE を返す必要があります。

IWbemServices の任意のメソッドから出力されるインターフェイスポインターは、そのメソッドを呼び出す前にすべて NULL に初期化しておく必要があります。たとえば、 IWbemServices::GetObject メソッドの呼び出しは IWbemClassObject インターフェイスポインターを返しますが、これは IWbemServices::GetObject メソッドを呼び出す前にあらかじめ NULL に初期化しておく必要があります。

IWbemServices を使用する C++ の例は多数あります。WMI C++ アプリケーションの例のセクションを参照してください。

次のコード例は、プロバイダーが IWbemServices ポインターを取得する方法を示しています。このコードをコンパイルするには、以下の #include 文と参照が必要です。

#include <iostream>
using namespace std;
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
IWbemLocator *pIWbemLocator = NULL;

HRESULT hRes = CoCreateInstance (
            CLSID_WbemAdministrativeLocator,
            NULL ,
            CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER , 
            IID_IUnknown ,
            ( void ** ) &pIWbemLocator
            ) ;

IWbemServices *pWbemServices = NULL;

if (SUCCEEDED(hRes))
{
    BSTR namespace = SysAllocString(L"root\\CIMV2");
    hRes = pIWbemLocator->ConnectServer(
                namespace,      // Namespace
                NULL,           // Userid
                NULL,           // PW
                NULL,           // Locale
                0,              // flags
                NULL,           // Authority
                NULL,           // Context
                &pWbemServices
                );
    SysFreeString(namespace);            

    pIWbemLocator->Release(); // Free memory resources.

    // Use pWbemServices

}

// Clean up
pWbemServices->Release();

メソッド 23

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT OpenNamespace(LPWSTR strNamespace, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemServices** ppWorkingNamespace, IWbemCallResult** ppResult)

IWbemServices::OpenNamespace メソッドは、指定した子名前空間を操作コンテキストとする新しい IWbemServices ポインターを呼び出し元に提供します。

strNamespaceLPWSTRin対象となる名前空間へのパス。詳細については、 Creating Hierarchies within WMI を参照してください。この名前空間は、 IWbemServices インターフェイスポインターに関連付けられている現在の名前空間からの相対パスでのみ指定できます。このパラメーターに絶対パスや NULL を指定することはできません。
lFlagsWBEM_GENERIC_FLAG_TYPEinこのパラメーターに 0 を設定すると同期呼び出しになります。半同期呼び出しにするには、lFlagsWBEM_FLAG_RETURN_IMMEDIATELY を設定し、ppResult パラメーターに有効なポインターを渡します。この場合、呼び出しはすぐに戻ります。詳細については、 Calling a Method を参照してください。
pCtxIWbemContext*in予約されています。このパラメーターは NULL でなければなりません。
ppWorkingNamespaceIWbemServices**inoutoptional新しい名前空間コンテキストを表すオブジェクトを受け取ります。返されるポインターの参照カウントは 1 以上です。呼び出し元は、不要になった時点でこのポインターに対して Release を呼び出す必要があります。エラーが発生した場合、このポインターは NULL に設定されます。このパラメーターを指定する場合、ppResultNULL でなければなりません。
ppResultIWbemCallResult**inoutoptional

通常は NULL です。NULL でない場合、ppWorkingNamespaceNULL にする必要があります。この場合、このパラメーターは新しい IWbemCallResult オブジェクトへのポインターを受け取ります。lFlags パラメーターに WBEM_FLAG_RETURN_IMMEDIATELY が設定されている場合、この呼び出しはすぐに戻ります。その後、呼び出し元は、要求した名前空間のポインターが利用可能になるまで IWbemCallResult::GetResultServices メソッドを定期的にポーリングできます。エラーが発生して新しいオブジェクトが返されない場合、このパラメーターは NULL を指すように設定されます。

注意 このパラメーターを使用する場合、メソッドを呼び出す前に ppResultNULL を指すように設定しておく必要があることに注意してください。これは COM の規則です。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

解説(Remarks)

IWbemLocator::ConnectServer メソッドでも同じ名前空間を開くことができます。唯一の違いは、 OpenNamespace メソッドでは Namespace パラメーターに相対オブジェクトパスを指定して子名前空間を再帰的に開けるのに対し、 IWbemLocator::ConnectServer では完全なオブジェクトパスが必要な点です。詳細については、 Describing a WMI Namespace Object Path を参照してください。

たとえば、 IWbemServices インターフェイスポインターに関連付けられている現在の名前空間が root である場合、Namespace パラメーターに Default を指定すると、root\default 名前空間にバインドされた新しいポインターが得られます。

名前空間は、Release が呼び出されて参照カウントが 0 (ゼロ) になった時点で閉じられます。

vtbl 4 HRESULT CancelAsyncCall(IWbemObjectSink* pSink)

IWbemServices::CancelAsyncCall メソッドは、非同期メソッドに元々渡された IWbemObjectSink ポインターに基づいて、現在保留中の非同期呼び出しをキャンセルします。

pSinkIWbemObjectSink*inIWbemServices のいずれかの非同期メソッドに対してクライアントが提供した IWbemObjectSink 実装へのポインター。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

注意 WMI が CancelAsyncCall を処理する時点で、アプリケーションのシンクに対して SetStatus がまだ呼び出されていない場合、WMI は hResult パラメーターの値として WBEM_E_CALL_CANCELLED を指定して、そのシンクに対して SetStatus を呼び出します。
WMI が操作をキャンセルできるかどうかは、タイミングと非同期操作の性質に左右されます。完了前にキャンセルが成功する可能性が高いのは、時間のかかるクエリだけです。非同期の削除や変更などの高速な操作は、通常、WMI が CancelAsyncCall の呼び出しを処理する前に完了してしまいます。したがって、 CancelAsyncCall は現在の操作をキャンセルしようとしますが、実際には IWbemObjectSink ポインターの解放しか行えないこともあります。
注意 同じオブジェクトシンクを使用して多数の非同期呼び出しを行うことも可能です。その場合、 CancelAsyncCall メソッドは、このオブジェクトシンクを共有するすべての非同期呼び出しをキャンセルします。未完了の非同期呼び出しごとにオブジェクトシンクのインスタンスを 1 つずつ作成することを強く推奨します。

解説(Remarks)

シンクへのコールバックが、クライアントが要求するのと同じ認証レベルで返されるとは限らないため、非同期通信ではなく半同期通信を使用することを推奨します。詳細については、Calling a Method を参照してください。IWbemObjectSink::Indicate または IWbemObjectSink::SetStatus の実装内から CancelAsyncCall を呼び出すと WMI の状態に影響を与える可能性があるため、推奨されません。

ExecMethodAsync のようなメソッド呼び出しの場合、キャンセルされるのは呼び出しのクライアント側だけです。実装しているプロバイダーには呼び出しがキャンセルされたことは通知されず、処理は最後まで実行されます。

非同期呼び出しの使用方法の詳細については、Making an Asynchronous Call with C++ および Receiving Asynchronous Event Notifications を参照してください。

CancelAsyncCall を使用する完全な例については、Example: Receiving Event Notifications Through WMI を参照してください。

次の C++ サンプルは、\\Program Files\Microsoft SDKs\Windows\v7.0\Samples\sysmgmt\wmi\vc\decoupled\instance_provider サンプルから抜粋したもので、CancelAsyncCall の実装例を示しています。
HRESULT CProvider_IWbemServices :: CancelAsyncCall ( 
  
 IWbemObjectSink *a_Sink
)
{
 HRESULT t_Result = WBEM_E_NOT_AVAILABLE ;
 return t_Result ;
}
vtbl 5 HRESULT QueryObjectSink(WBEM_GENERIC_FLAG_TYPE lFlags, IWbemObjectSink** ppResponseHandler)

IWbemServices::QueryObjectSink メソッドを使用すると、呼び出し元は Windows Management がエクスポートする通知ハンドラーを取得できます。

lFlagsWBEM_GENERIC_FLAG_TYPEin予約されています。このパラメーターは 0 でなければなりません。
ppResponseHandlerIWbemObjectSink**out

通知ハンドラーへのインターフェイスポインターを受け取ります。エラーが発生した場合は NULL を指すように設定されます。返されるポインターの参照カウントは 1 以上であり、呼び出し元は不要になった時点でこのポインターに対して IWbemServices::Release を呼び出す必要があります。利用可能な通知ハンドラーがない場合は NULL が返されることがありますが、これはエラーではありません。

注意 このメソッドに渡す ppResponseHandler パラメーターの値を NULL にすることはできません。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

注意 既定では、QueryObjectSink を使用したイベントの発行は Administrators にのみ許可されています。他のユーザーにこの権限を与えるには、 WBEM_FULL_WRITE 権限を付与する必要があります。
vtbl 6 HRESULT GetObject(LPWSTR strObjectPath, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemClassObject** ppObject, IWbemCallResult** ppCallResult)

IWbemServices::GetObject メソッドは、クラスまたはインスタンスを取得します。このメソッドは、現在の IWbemServices オブジェクトに関連付けられた名前空間からのみオブジェクトを取得します。

strObjectPathLPWSTRin取得するオブジェクトのパス。NULL の場合、新しいクラスにすることができる空のオブジェクトが返されます。詳細については、 Creating a Class を参照してください。
lFlagsWBEM_GENERIC_FLAG_TYPEin

次のフラグがこのメソッドの動作に影響します。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

このフラグを設定すると、WMI は現在の接続のロケールに対応するローカライズ済み名前空間に格納されている amended 修飾子を取得します。設定しない場合は、直近の名前空間に格納されている修飾子のみが取得されます。

WBEM_FLAG_RETURN_WBEM_COMPLETE

このフラグを指定すると同期呼び出しになります。

WBEM_FLAG_RETURN_IMMEDIATELY

このフラグを指定すると半同期呼び出しになります。ppCallResult パラメーターに有効なポインターを渡す必要があります。詳細については、 Calling a Method を参照してください。

WBEM_FLAG_DIRECT_READ

このフラグを指定すると、親クラスやサブクラスを考慮せずに、指定したクラスのプロバイダーに直接アクセスします。

pCtxIWbemContext*in通常は NULL です。それ以外の場合は、要求されたクラスまたはインスタンスを生成するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
ppObjectIWbemClassObject**inoutoptionalNULL でない場合、オブジェクトが見つかればそのオブジェクトを受け取ります。返されるオブジェクトの参照カウントは 1 以上です。呼び出し元は、オブジェクトが不要になった時点で Release を呼び出す必要があります。エラーが発生した場合は、いずれの場合もこのパラメーターは NULL を指すように設定されます。
ppCallResultIWbemCallResult**inoutoptionalNULL の場合、このパラメーターは使用されません。lFlags パラメーターに WBEM_FLAG_RETURN_IMMEDIATELY が含まれている場合、この呼び出しは WBEM_S_NO_ERROR を返してすぐに戻ります。ppCallResult パラメーターは新しい IWbemCallResult オブジェクトへのポインターを受け取り、 GetCallStatus メソッドでポーリングして結果を取得できます。呼び出し元は IWbemCallResult::GetResultObject を呼び出して、オブジェクトが利用可能になった時点で取得できます。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

vtbl 7 HRESULT GetObjectAsync(LPWSTR strObjectPath, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemObjectSink* pResponseHandler)

IWbemServices::GetObjectAsync メソッドは、パスに基づいてオブジェクト (クラス定義またはインスタンス) を取得します。

strObjectPathLPWSTRin

取得するオブジェクトのパス。インスタンスプロバイダーの場合、StrObjectPath は次の形式で指定できます。

  • Namespace:Class.Key = "Value"
  • Namespace:Class = "Value"
  • Namespace:Class.Key = "Value", Key2 = "Value2"
クラスの前に名前空間を指定するかどうかは任意です。名前空間を含まないオブジェクトパスは、現在の名前空間内のインスタンスを参照します。必要に応じて、文字列型プロパティの開始と終了を区切るために、二重引用符 (") の代わりに単一引用符 (') を使用できます。

NULL の場合は、新しいクラスにすることができる空のオブジェクトが返されます。詳細については、 Creating a Class を参照してください。

lFlagsWBEM_GENERIC_FLAG_TYPEin

次のフラグがこのメソッドの動作に影響します。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

このフラグを設定すると、WMI は現在の接続のロケールに対応するローカライズ済み名前空間に格納されている amended 修飾子を取得します。設定しない場合は、直近の名前空間に格納されている修飾子のみが取得されます。

WBEM_FLAG_DIRECT_READ

このフラグを指定すると、親クラスやサブクラスを考慮せずに、指定したクラスのプロバイダーに直接アクセスします。

WBEM_FLAG_SEND_STATUS

クライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。

pCtxIWbemContext*in通常は NULL です。それ以外の場合は、要求されたクラスまたはインスタンスを生成するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
pResponseHandlerIWbemObjectSink*in呼び出し元による IWbemObjectSink の実装へのポインター。このハンドラーは、要求されたオブジェクトが利用可能になった時点で IWbemObjectSink::Indicate メソッドを通じてそれを受け取ります。オブジェクトは pObjParam パラメーターに格納されます。何らかのエラーコードが返された場合、渡された IWbemObjectSink ポインターは使用されません。WBEM_S_NO_ERROR が返された場合は、操作結果を通知するためにユーザーの IWbemObjectSink 実装が呼び出されます。Windows Management がポインターに対して AddRef を呼び出すのは、WBEM_S_NO_ERROR が返される場合だけです。エラーコードが返される場合、参照カウントは呼び出し前と同じです。このパラメーターの詳細については、 Calling a Method を参照してください。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfoGetErrorInfo から利用可能な情報を取得できます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

解説(Remarks)

インスタンスプロバイダーを実装する際は、PSDK の WMI セクションにあるオブジェクトパスパーサーのサンプルコードを使用してオブジェクトパスを解析し、クライアントがどのオブジェクトを要求しているかを判別してください。さらに、派生クラスをサポートするプロバイダーは、継承されたプロパティではなく、そのクラスのローカルプロパティの値だけを提供すれば十分です。継承されたプロパティの処理は、WMI が基底クラスのプロバイダーに要求します。

クラスプロバイダーを実装する場合、 GetObjectAsyncstrObjectPath パラメーターに格納されたクラス名のオブジェクトパスを解析して、どのクラスが要求されているかを判別する必要があります。次に、 GetObjectAsync メソッドはクラスを動的に構築するか、プライベートキャッシュから取り出します。そして GetObjectAsync は、pResponseHandler パラメーターが指す IWbemObjectSink ポインターを使用して、そのクラスを WMI に送信します。結果セットの終わりを示すために IWbemObjectSink::SetStatus メソッドが呼び出されます。エラーが発生した場合は、 IWbemObjectSink::Indicate を一度も呼び出さずに SetStatus が呼び出されることもあります。

コールバックが、クライアントが要求するのと同じ認証レベルで返されるとは限らないため、非同期通信ではなく半同期通信を使用することを推奨します。非同期通信が必要な場合は、Calling a Method を参照してください。

メソッドを半同期で使用する方法の詳細については、IWbemServices::GetObject および Calling a Method を参照してください。

次の例は、インスタンスプロバイダー向けに GetObjectAsync を実装する方法を示しています。

SCODE CInstPro::GetObjectAsync (BSTR ObjectPath, 
                                long lFlags, IWbemContext *pCtx,
                                IWbemObjectSink FAR* pHandler)
{
    ULONG cRef;         // Reference count
    SCODE sc;
    BOOL bOK = FALSE;

    IWbemServices *  m_pNamespace;
    IWbemClassObject FAR* pObj;

    // Check arguments.

    if(ObjectPath == NULL || pHandler == NULL ||
        m_pNamespace == NULL)
        return WBEM_E_INVALID_PARAMETER;

    
    // Based on the object path, produce an empty instance
    // of the class and gather required data,
    // setting the instance's property values accordingly.
    // This example assumes that GetByPath is implemented
    // by the provider to do this.
    // The IWbemPath interface can be used to parse
    // the object path, separating the namespace and class name.

    sc = GetByPath (ObjectPath, &pObj, pCtx);
    if(sc == S_OK) 
    {
        pHandler->Indicate (1, &pObj);
        pObj->Release();
        bOK = TRUE;
    }

    sc = (bOK) ? S_OK : WBEM_E_NOT_FOUND;

    // Set status.

    pHandler->SetStatus(0,sc, NULL, NULL);

    // Free memory resources.

    SysFreeString(ObjectPath);
    m_pNamespace->Release();
    pObj->Release();

    return sc;
  
}

次の例は、一般的なクラスプロバイダーが GetObjectAsync を実装する方法を示しています。

HRESULT CStdProvider::GetObjectAsync( 
            /* [in] */ BSTR strObjectPath,
            /* [in] */ long lFlags,
            /* [in] */ IWbemContext __RPC_FAR *pCtx,
            /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
            )
{

    IWbemClassObject *pClass = 0;

// Assume there is an IWbemServices pointer available.
// Retrieve an 'empty' object which is built up
// into the class definition.

    HRESULT hRes = m_pSvc->GetObject(NULL, 0, NULL, &pClass, 0);
    if (hRes)
        return hRes;

// Parse the object path and determine which class is   
// required. The path string is the required class name.
// Fill in the properties required for the class definition
// using pClass->Put(...), and so on.

    
    // ...

    // Send the class definition back to WMI.
    pResponseHandler->Indicate(1, &pClass);

// Indicate that it is now finished.

    pResponseHandler->SetStatus(0, WBEM_S_NO_ERROR, 0, 0);
    SysFreeString(strObjectPath);
    m_pSvc->Release();
    pClass->Release();  // This is no longer needed.
    return WBEM_S_NO_ERROR;
}
vtbl 8 HRESULT PutClass(IWbemClassObject* pObject, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemCallResult** ppCallResult)

IWbemServices::PutClass メソッドは、新しいクラスを作成するか、既存のクラスを更新します。pObject パラメーターで指定するクラスは、必要なすべてのプロパティ値が正しく初期化されている必要があります。

pObjectIWbemClassObject*in有効なクラス定義を指している必要があります。参照カウントは変更されません。
lFlagsWBEM_GENERIC_FLAG_TYPEin

次のフラグがこのメソッドの動作に影響します。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

このフラグを設定すると、WMI は amended フレーバーを持つ修飾子を一切格納しません。このフラグを設定しない場合、このオブジェクトはローカライズされていないものとみなされ、すべての修飾子がこのインスタンスとともに格納されます。

WBEM_FLAG_CREATE_OR_UPDATE

このフラグを指定すると、クラスが存在しない場合は作成され、既に存在する場合は上書きされます。

WBEM_FLAG_UPDATE_ONLY

このフラグを指定すると、この呼び出しは更新になります。呼び出しが成功するには、クラスが存在している必要があります。

WBEM_FLAG_CREATE_ONLY

このフラグは作成専用です。クラスが既に存在する場合、呼び出しは失敗します。

WBEM_FLAG_RETURN_IMMEDIATELY

このフラグを指定すると半同期呼び出しになります。詳細については、 Calling a Method を参照してください。

WBEM_FLAG_OWNER_UPDATE

プッシュプロバイダーは、このクラスが変更されたことを示すために、 PutClass を呼び出す際にこのフラグを指定する必要があります。

WBEM_FLAG_UPDATE_COMPATIBLE

このフラグを指定すると、派生クラスがなく、そのクラスのインスタンスも存在しない場合にクラスを更新できます。また、変更が重要でない修飾子 (たとえば Description 修飾子) に対するものだけであれば、あらゆる場合に更新が許可されます。これはこの呼び出しの既定の動作であり、以前のバージョンの Windows Management との互換性のために使用されます。クラスにインスタンスがある場合、または重要な修飾子に対する変更である場合、更新は失敗します。

WBEM_FLAG_UPDATE_SAFE_MODE

このフラグを指定すると、子クラスが存在していても、その変更が子クラスと競合しない限りクラスを更新できます。このフラグで許可される更新の例としては、どの子クラスにも記述されていない新しいプロパティを基底クラスに追加する場合が挙げられます。クラスにインスタンスがある場合、更新は失敗します。

WBEM_FLAG_UPDATE_FORCE_MODE

このフラグを指定すると、競合する子クラスが存在する場合でもクラスの更新を強制します。このフラグで強制される更新の例としては、あるクラス修飾子が子クラスで定義されており、基底クラスが既存の修飾子と競合する同じ修飾子を追加しようとする場合が挙げられます。強制モードでは、この競合は子クラス側の競合する修飾子を削除することで解決されます。

pCtxIWbemContext*in通常は NULL です。それ以外の場合は、クラスのインスタンスを生成する動的クラスプロバイダーが必要とする IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
ppCallResultIWbemCallResult**inoutoptionalNULL の場合、このパラメーターは使用されません。lFlags パラメーターに WBEM_FLAG_RETURN_IMMEDIATELY が含まれている場合、この呼び出しは WBEM_S_NO_ERROR を返してすぐに戻ります。ppCallResult パラメーターは新しい IWbemCallResult オブジェクトへのポインターを受け取り、 IWbemCallResult::GetCallStatus メソッドでポーリングして結果を取得できます。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

注意 クライアントやプロバイダーが使用中のクラス定義を変更すると、予期しない動作が発生します。 IWbemServices::PutClass メソッドは、そのクラスを使用しているクライアントやプロバイダーが存在しない場合にのみ、クラスの作成または更新に使用してください。
vtbl 9 HRESULT PutClassAsync(IWbemClassObject* pObject, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemObjectSink* pResponseHandler)

IWbemServices::PutClassAsync メソッドは、新しいクラスを作成するか、既存のクラスを更新します。

pObjectIWbemClassObject*inクラス定義を含むオブジェクトへのポインター。
lFlagsWBEM_GENERIC_FLAG_TYPEin

次の値のうち 1 つ以上を指定できます。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

このフラグを設定すると、WMI は amended フレーバーを持つ修飾子を一切格納しません。このフラグを設定しない場合、このオブジェクトはローカライズされていないものとみなされ、すべての修飾子がこのインスタンスとともに格納されます。

WBEM_FLAG_CREATE_OR_UPDATE

このフラグを指定すると、クラスが存在しない場合は作成され、既に存在する場合は上書きされます。

WBEM_FLAG_UPDATE_ONLY

既存のクラスを更新します。

WBEM_FLAG_CREATE_ONLY

このフラグはクラスの作成専用です。クラスが既に存在する場合、呼び出しは失敗します。

WBEM_FLAG_SEND_STATUS

このフラグは、クライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を Windows Management に登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。

WBEM_FLAG_OWNER_UPDATE

プッシュプロバイダーは、このクラスが変更されたことを示すために、 PutClassAsync を呼び出す際にこのフラグを指定する必要があります。

WBEM_FLAG_UPDATE_COMPATIBLE

このフラグを指定すると、派生クラスがなく、そのクラスのインスタンスも存在しない場合にクラスを更新できます。また、変更が重要でない修飾子 (たとえば Description 修飾子) に対するものだけであれば、あらゆる場合に更新が許可されます。これはこの呼び出しの既定の動作であり、以前のバージョンの Windows Management との互換性のために使用されます。クラスにインスタンスがある場合、または重要な修飾子に対する変更である場合、更新は失敗します。

WBEM_FLAG_UPDATE_SAFE_MODE

このフラグを指定すると、子クラスが存在していても、その変更が子クラスと競合しない限りクラスを更新できます。このフラグで許可される更新の例としては、どの子クラスにも記述されていない新しいプロパティを基底クラスに追加する場合が挙げられます。クラスにインスタンスがある場合、更新は失敗します。

WBEM_FLAG_UPDATE_FORCE_MODE

このフラグを指定すると、競合する子クラスが存在する場合でもクラスの更新を強制します。このフラグで強制される更新の例としては、あるクラス修飾子が子クラスで定義されており、基底クラスが既存の修飾子と競合する同じ修飾子を追加しようとする場合が挙げられます。強制モードでは、この競合は子クラス側の競合する修飾子を削除することで解決されます。

pCtxIWbemContext*in通常は NULL です。それ以外の場合は、要求されたクラスを受け取るプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
pResponseHandlerIWbemObjectSink*in呼び出し元による IWbemObjectSink の実装へのポインター。このハンドラーは、 Put 要求の状態が利用可能になった時点で、 SetStatus メソッドを通じてそれを受け取ります。何らかのエラーコードが返された場合、渡された IWbemObjectSink ポインターは使用されません。WBEM_S_NO_ERROR が返された場合は、操作結果を通知するためにユーザーの IWbemObjectSink 実装が呼び出されます。Windows Management がポインターに対して AddRef を呼び出すのは、WBEM_S_NO_ERROR が返される場合だけです。エラーコードが返される場合、参照カウントは呼び出し前と同じです。このパラメーターの詳しい説明については、 Calling a Method を参照してください。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

その他の状態コードやエラーコードは、pReponseHandler パラメーターで指定したオブジェクトシンクに報告されます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

なお、 PutInstanceAsyncWBEM_S_NO_ERROR を返した場合、WMI は応答ハンドラーの SetStatus メソッドからの結果を待機します。WMI は、ローカル接続では無期限に、リモート接続ではタイムアウトが発生するまで待機します。

WBEM_E_FAILED を返すと他のプロバイダーがクラスを作成する機会を失うため、このコードは、後で成功する可能性のある形でクラスプロバイダーが失敗した場合にのみ返すようにしてください。

注意 クライアントやプロバイダーが使用中のクラス定義を変更すると、予期しない動作が発生します。 IWbemServices::PutClass メソッドは、そのクラスを使用しているクライアントやプロバイダーが存在しない場合にのみ、クラスの作成または更新に使用してください。

解説(Remarks)

特定のクラスに対して複数のクラスプロバイダーがインストールされている場合、WMI はどのクラスプロバイダーがそのクラスを作成できるかを判別できません。

結果セットの終わりを示すために IWbemObjectSink::SetStatus メソッドが呼び出されます。エラーが発生した場合は、 IWbemObjectSink::Indicate を一度も呼び出さずに呼び出されることもあります。

コールバックが、クライアントが要求するのと同じ認証レベルで返されるとは限らないため、非同期通信ではなく半同期通信を使用することを推奨します。非同期通信が必要な場合は、Calling a Method を参照してください。

メソッドを半同期で使用する方法の詳細については、 IWbemServices::PutClass および Calling a Method を参照してください。

次のコード例は、 PutClassAsync の簡単な実装を示しています。

HRESULT CStdProvider::PutClassAsync( 
            /* [in] */ IWbemClassObject __RPC_FAR *pObject,
            /* [in] */ long lFlags,
            /* [in] */ IWbemContext __RPC_FAR *pCtx,
            /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
            )
{
    // You must implement the ClassIsValid function yourself to
    // determine if the class contains a valid instance
   if (ClassIsValid(lFlags, pObject))
   {
       return WBEM_S_NO_ERROR;
   }

   return WBEM_E_PROVIDER_NOT_CAPABLE;   
}
vtbl 10 HRESULT DeleteClass(LPWSTR strClass, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemCallResult** ppCallResult)

IWbemServices::DeleteClass メソッドは、指定したクラスを現在の名前空間から削除します。

strClassLPWSTRin削除対象のクラスの名前。
lFlagsWBEM_GENERIC_FLAG_TYPEin

次のいずれかの値を設定できます。

WBEM_FLAG_RETURN_IMMEDIATELY

このフラグを指定すると半同期呼び出しになります。詳細については、 Calling a Method を参照してください。

WBEM_FLAG_OWNER_UPDATE

呼び出し元がプッシュプロバイダーであることを示します。

pCtxIWbemContext*in通常は NULL です。それ以外の場合は、クラスを削除するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
ppCallResultIWbemCallResult**inoutoptionalNULL の場合、このパラメーターは使用されません。ppCallResult を指定する場合は、呼び出し時に NULL を指すように設定しておく必要があります。lFlags パラメーターに WBEM_FLAG_RETURN_IMMEDIATELY が含まれている場合、この呼び出しは WBEM_S_NO_ERROR を返してすぐに戻ります。ppCallResult パラメーターは新しい IWbemCallResult オブジェクトへのポインターを受け取り、 GetCallStatus メソッドでポーリングして結果を取得できます。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

vtbl 11 HRESULT DeleteClassAsync(LPWSTR strClass, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemObjectSink* pResponseHandler)

IWbemServices::DeleteClassAsync メソッドは、指定したクラスを現在の名前空間から削除します。

strClassLPWSTRin削除対象のクラスの名前。
lFlagsWBEM_GENERIC_FLAG_TYPEin

次の値のうち 1 つ以上を指定できます。

WBEM_FLAG_SEND_STATUS

このフラグは、クライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を Windows Management に登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。

WBEM_FLAG_OWNER_UPDATE

プッシュプロバイダーは、このクラスが変更されたことを示すために、 DeleteClassAsync を呼び出す際にこのフラグを指定する必要があります。

pCtxIWbemContext*in通常は NULL です。それ以外の場合は、クラスを削除するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
pResponseHandlerIWbemObjectSink*in呼び出し元が実装した IWbemObjectSink へのポインター。このハンドラーは、削除要求の状態が利用可能になった時点で IWbemObjectSink::SetStatus メソッドを通じてそれを受け取ります。何らかのエラーコードが返された場合、渡された IWbemObjectSink ポインターは使用されません。WBEM_S_NO_ERROR が返された場合は、操作結果を通知するためにユーザーの IWbemObjectSink 実装が呼び出されます。Windows Management がポインターに対して AddRef を呼び出すのは、WBEM_S_NO_ERROR が返される場合だけです。エラーコードが返される場合、参照カウントは呼び出し前と同じです。このパラメーターの詳しい説明については、 Calling a Method を参照してください。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

その他のすべての戻りコードは、pReponseHandler パラメーターで指定したオブジェクトシンクに SetStatus メソッドを通じて渡されます。クラスが存在しない場合や、ユーザーにクラスを削除する権限がない場合などのエラー状態はハンドラーに報告され、このメソッドの戻りコードには反映されません。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

解説(Remarks)

動的インスタンスプロバイダーがそのクラスに関連付けられている場合、そのプロバイダーは登録解除され、以後そのクラスに対して呼び出されなくなります。削除されたクラスから派生するクラスもすべて削除され、それらに関連付けられたプロバイダーも登録解除されます。クラスが削除されると、指定したクラスとそのサブクラスの残存する静的インスタンスもすべて削除されます。

クラスが動的クラスプロバイダーによって提供されている場合、削除が成功するかどうかは、そのプロバイダーがクラスの削除をサポートしているかどうかに依存します。

注意 標準のシステムクラスは削除できません。
コールバックが、クライアントが要求するのと同じ認証レベルで返されるとは限らないため、非同期通信ではなく半同期通信を使用することを推奨します。非同期通信が必要な場合は、Calling a Method を参照してください。

メソッドを半同期で使用する方法の詳細については、IWbemServices::DeleteClass および Calling a Method を参照してください。

vtbl 12 HRESULT CreateClassEnum(LPWSTR strSuperclass, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IEnumWbemClassObject** ppEnum)

IWbemServices::CreateClassEnum メソッドは、選択条件を満たすすべてのクラスの列挙子を返します。

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

次のフラグがこのメソッドの動作に影響します。最良のパフォーマンスを得るには、このパラメーターに WBEM_FLAG_RETURN_IMMEDIATELYWBEM_FLAG_FORWARD_ONLY を指定することを推奨します。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

このフラグを設定すると、WMI は現在の接続のロケールに対応するローカライズ済み名前空間に格納されている amended 修飾子を取得します。設定しない場合は、直近の名前空間に格納されている修飾子のみが取得されます。

WBEM_FLAG_DEEP

このフラグを指定すると、階層内のすべてのサブクラスが列挙に含まれます (ただし、このクラス自体は含まれません)。

WBEM_FLAG_SHALLOW

このフラグを指定すると、このクラスに存在しないプロパティを提供するサブクラスのインスタンスをすべて除外し、このクラス自体のインスタンスのみが列挙に含まれます。

WBEM_FLAG_RETURN_IMMEDIATELY

このフラグを指定すると半同期呼び出しになります。詳細については、 Calling a Method を参照してください。

WBEM_FLAG_FORWARD_ONLY

このフラグを指定すると、前方参照専用の列挙子が返されます。前方参照専用の列挙子は通常、従来の列挙子より高速でメモリ使用量も少なくなりますが、 CloneReset を呼び出すことはできません。

WBEM_FLAG_BIDIRECTIONAL

このフラグを指定すると、クライアントが列挙子を解放するまで、WMI は列挙対象オブジェクトへのポインターを保持します。オブジェクトのポインターがすぐには解放されないため、クライアントが大量のオブジェクトを列挙しようとすると、このメソッドは WBEM_E_OUT_OF_MEMORY という HRESULT で失敗する可能性があります。lFlags パラメーターに 0 (ゼロ) を設定した場合、既定でこのフラグが適用されます。

pCtxIWbemContext*in通常は NULL です。それ以外の場合は、要求されたクラスを提供するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
ppEnumIEnumWbemClassObject**out列挙子へのポインターを受け取ります。返されるオブジェクトの参照カウントは 1 以上です。呼び出し元は、不要になった時点でこのポインターに対して Release を呼び出す必要があります。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

vtbl 13 HRESULT CreateClassEnumAsync(LPWSTR strSuperclass, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemObjectSink* pResponseHandler)

IWbemServices::CreateClassEnumAsync メソッドは、クラスプロバイダーがサポートするすべてのクラスの列挙を返します。

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

次の値のうち 1 つ以上を指定できます。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

このフラグを設定すると、Windows Management Instrumentation (WMI) は現在の接続のロケールに対応するローカライズ済み名前空間に格納されている amended 修飾子を取得します。設定しない場合は、直近の名前空間に格納されている修飾子のみが取得されます。

WBEM_FLAG_BIDIRECTIONAL

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

WBEM_FLAG_DEEP

このフラグを指定すると、このクラスと階層内のすべてのサブクラスが列挙に含まれます。

WBEM_FLAG_SHALLOW

このフラグを指定すると、このクラスに存在しないプロパティを提供するサブクラスのインスタンスをすべて除外し、このクラス自体のインスタンスのみが列挙に含まれます。

WBEM_FLAG_SEND_STATUS

このフラグは、クライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を WMI に登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。

注意 strSuperclassNULL または空で、かつ WBEM_FLAG_DEEP が指定されている場合は、すべてのクラスが返されます。
pCtxIWbemContext*in通常は NULL です。それ以外の場合は、要求されたクラスを返すプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
pResponseHandlerIWbemObjectSink*in呼び出し元による IWbemObjectSink の実装へのポインター。このハンドラーは、 IWbemObjectSink::Indicate メソッドを使用して、オブジェクトが利用可能になるたびにそれらを受け取ります。利用可能なオブジェクトがなくなると、WMI によって IWbemObjectSink::SetStatus メソッドが呼び出されます。何らかのエラーコードが返された場合、渡された IWbemObjectSink ポインターは使用されません。WBEM_S_NO_ERROR が返された場合は、操作結果を通知するためにユーザーの IWbemObjectSink 実装が呼び出されます。WMI がポインターに対して AddRef を呼び出すのは、WBEM_S_NO_ERROR が返される場合だけです。エラーコードが返される場合、参照カウントは呼び出し前と同じです。このパラメーターの詳しい説明については、 Calling a Method を参照してください。

戻り値

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

解説(Remarks)

コールバックが、クライアントが要求するのと同じ認証レベルで返されるとは限らないため、非同期通信ではなく半同期通信を使用することを推奨します。非同期通信が必要な場合は、Calling a Method を参照してください。

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

次のコード例は、 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 のパフォーマンスにどのような影響を与えるかを確認するとよいでしょう。

vtbl 14 HRESULT PutInstance(IWbemClassObject* pInst, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemCallResult** ppCallResult)

IWbemServices::PutInstance メソッドは、既存クラスのインスタンスを作成または更新します。インスタンスは WMI リポジトリに書き込まれます。

pInstIWbemClassObject*in書き込むインスタンスへのポインター。呼び出し元は、この呼び出しの完了時点における参照カウントについて仮定を置くことはできません。
lFlagsWBEM_GENERIC_FLAG_TYPEin

次の値のうち 1 つ以上を設定できます。

WBEM_FLAG_CREATE_OR_UPDATE

このフラグを指定すると、インスタンスが存在しない場合は作成され、既に存在する場合は上書きされます。

WBEM_FLAG_UPDATE_ONLY

このフラグを指定すると、この呼び出しは更新になります。呼び出しが成功するには、インスタンスが存在している必要があります。

WBEM_FLAG_CREATE_ONLY

このフラグは作成専用です。インスタンスが既に存在する場合、呼び出しは失敗します。

WBEM_FLAG_RETURN_IMMEDIATELY

このフラグを指定すると半同期呼び出しになります。詳細については、 Calling a Method を参照してください。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

このフラグを設定すると、WMI は Amended フレーバーを持つ修飾子を一切格納しません。このフラグを設定しない場合、このオブジェクトはローカライズされていないものとみなされ、すべての修飾子がこのインスタンスとともに格納されます。

pCtxIWbemContext*in

通常は NULL であり、この場合インスタンスのすべてのプロパティが更新されることを示します。それ以外の場合は、インスタンスに関する追加情報を含む IWbemContext オブジェクトへのポインターです。コンテキストオブジェクト内のデータは、そのインスタンスを担当するプロバイダーによって文書化されている必要があります。NULL でない IWbemContext オブジェクトは、部分インスタンス更新のサポートの有無を示すことができます。

完全インスタンス更新と部分インスタンス更新をサポートする方法の詳細については、 IWbemServices::PutInstanceAsync を参照してください。完全インスタンス更新または部分インスタンス更新の操作を要求する方法の詳細については、 Modifying an Instance Property を参照してください。

ppCallResultIWbemCallResult**inoutoptionalNULL の場合、このパラメーターは使用されません。lFlags パラメーターに WBEM_FLAG_RETURN_IMMEDIATELY が含まれている場合、この呼び出しは WBEM_S_NO_ERROR を返してすぐに戻ります。その場合、ppCallResult パラメーターは新しい IWbemCallResult オブジェクトへのポインターを受け取り、 IWbemCallResult::GetCallStatus でポーリングして結果を取得できます。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

解説(Remarks)

アプリケーションおよびプロバイダーは、既存クラスのインスタンスを作成または更新するために PutInstance を呼び出します。pCtx パラメーターの設定方法に応じて、インスタンスのプロパティの一部またはすべてが更新されます。部分インスタンス更新をサポートする方法の詳細については、 IWbemServices::PutInstanceAsync を参照してください。部分インスタンス更新を要求する方法の詳細については、 Modifying an Instance Property を参照してください。

PutInstance メソッドがサポートするのは、インスタンスの作成と更新だけです。インスタンスの移動はサポートしません。つまり、呼び出し元は、兄弟クラス内の別のインスタンスと同じキーを持つインスタンスを pInst パラメーターに設定することはできません。たとえば、ClassAClassBClassC の基底クラスであるとします。ClassA はキーとして KeyProp プロパティを定義しており、ClassB には KeyProp が 1 に設定されたインスタンスがあります。KeyProp が 1 の ClassC のインスタンスを作成するには、アプリケーションはまず DeleteInstance を呼び出して ClassB のインスタンスを削除し、その後 PutInstanceClassC のインスタンスを保存する必要があります。

pInst が指すインスタンスがサブクラスに属している場合、Windows Management は、そのサブクラスの派生元となるすべてのクラスを担当するプロバイダーを呼び出します。元の PutInstance 要求が成功するには、これらのプロバイダーがすべて成功する必要があります。階層の最上位クラスをサポートするプロバイダーが最初に呼び出されます。以降、最上位クラスのサブクラスへと呼び出しが続き、Windows Management が pInst の指すインスタンスを所有するクラスのプロバイダーに到達するまで、上から下へと進みます。

Windows Management は、インスタンスの子クラスのプロバイダーは呼び出しません。したがって、アプリケーションが継承されたプロパティの値を変更したい場合は、親クラスの対応するインスタンスではなく、子クラスの完全なインスタンスに対して PutInstance を呼び出す必要があります。

クラス階層に属するインスタンスを更新する場合、pInst パラメーターは、変更対象のプロパティを含むインスタンスを指している必要があります。たとえば、対象のインスタンスが ClassB に属しているとします。ClassB のインスタンスは ClassA から派生しており、ClassA はプロパティ PropA を定義しています。アプリケーションが ClassB のインスタンスにおける PropA の値を変更したい場合、pInst には ClassA のインスタンスではなく、その ClassB のインスタンスを設定する必要があります。

抽象クラスのインスタンスに対して PutInstance を呼び出すことは許可されていません。

vtbl 15 HRESULT PutInstanceAsync(IWbemClassObject* pInst, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemObjectSink* pResponseHandler)

IWbemServices::PutInstanceAsync メソッドは、既存クラスのインスタンスを非同期に作成または更新します。更新の確認またはエラー報告は、呼び出し元が実装する IWbemObjectSink インターフェイスを通じて提供されます。

pInstIWbemClassObject*inWMI リポジトリに書き込むインスタンスへのポインター。呼び出し元は、この呼び出しの完了時点における参照カウントについて仮定を置くことはできません。
lFlagsWBEM_GENERIC_FLAG_TYPEin

インスタンスが現在存在しない場合に、呼び出し元がインスタンスの作成を望むかどうかを指定します。

インスタンスプロバイダーを実装する際は、WBEM_E_PROVIDER_NOT_CAPABLE を返すことで、 lFlags のうち一部のフラグのみをサポートすることもできます。

このプロパティには、次の値のうち 1 つ以上を指定できます。

WBEM_FLAG_CREATE_OR_UPDATE

このフラグを指定すると、インスタンスが存在しない場合は作成され、既に存在する場合は上書きされます。

WBEM_FLAG_UPDATE_ONLY

既存のインスタンスを更新します。

WBEM_FLAG_CREATE_ONLY

このフラグはインスタンスの作成専用です。クラスが既に存在する場合、呼び出しは失敗します。

WBEM_FLAG_SEND_STATUS

このフラグは、クライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を Windows Management に登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

このフラグを設定すると、WMI は Amended フレーバーを持つ修飾子を一切格納しません。このフラグを設定しない場合、このオブジェクトはローカライズされていないものとみなされ、すべての修飾子がこのインスタンスとともに格納されます。

pCtxIWbemContext*inクライアントが部分インスタンス更新と完全インスタンス更新のどちらを要求しているかを示すポインター。部分インスタンス更新はインスタンスのプロパティの一部のみを変更するのに対し、完全インスタンス更新はすべてのプロパティを変更します。NULL の場合、このパラメーターは呼び出し元のアプリケーションが完全インスタンス更新を要求していることを示します。それ以外の場合は、クラスのインスタンスを生成する動的クラスプロバイダーが必要とする IWbemContext オブジェクトへのポインターです。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
pResponseHandlerIWbemObjectSink*in呼び出し元による IWbemObjectSink の実装へのポインター。このハンドラーは、この呼び出しの状態が利用可能になった時点で IWbemObjectSink::SetStatus メソッドを通じてそれを受け取ります。何らかのエラーコードが返された場合、渡された IWbemObjectSink ポインターは使用されません。WBEM_S_NO_ERROR が返された場合は、操作結果を通知するためにユーザーの IWbemObjectSink 実装が呼び出されます。Windows Management がポインターに対して AddRef を呼び出すのは、WBEM_S_NO_ERROR が返される場合だけです。エラーコードが返される場合、参照カウントは呼び出し前と同じです。非同期呼び出しを行う方法の詳細については、 Calling a Method を参照してください。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

なお、 PutInstanceAsyncWBEM_S_NO_ERROR を返した場合、WMI は応答ハンドラーの SetStatus メソッドからの結果を待機します。WMI は、ローカル接続では無期限に、リモート接続ではタイムアウトが発生するまで待機します。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

解説(Remarks)

PutInstanceAsync を呼び出すクライアントは、呼び出しの結果が自身の IWbemObjectSink::Indicate メソッドを通じて報告されることを常に想定しておく必要があります。

pInst が指すインスタンスが他のクラスから派生したクラスに属している場合、 PutInstanceAsync が成功するかどうかは、親クラスを担当するプロバイダーの成否に依存します。たとえば、pInstClassB に属し、ClassBClassA から派生している場合、ClassB に対する更新操作が成功するには、ClassA のプロバイダーが実装する PutInstanceAsync メソッドの呼び出しが成功する必要があります。詳細については、 IWbemServices::PutInstance の「解説」を参照してください。

インスタンスプロバイダーを実装する際、インスタンスのキープロパティが NULL に設定されている場合、 PutInstanceAsync はクラス内で一意であることが保証される値を選択する必要があります。WMI は、キープロパティが NULL のインスタンスを更新する要求を処理する際、内部的に GUID を生成してキープロパティに割り当てます。さらに、更新対象のインスタンスが子クラスに属している場合、操作の成否は、階層内の上位クラスを担当する各プロバイダーへの PutInstanceAsync 呼び出しの成否に依存します。他のすべてのプロバイダーが成功したことを確認するまで、WBEM_S_NO_ERROR を返してはいけません。詳細については、 IWbemServices::PutInstance を参照してください。

部分更新をサポートするインスタンスプロバイダーは、__PUT_EXTENSIONS コンテキスト値が存在するかどうかを確認する必要があります。システムコンテキスト値とは、WMI が特定の意味を持つものとして定義し、クライアントアプリケーションが設定し、インスタンスプロバイダーがサポートする値です。 IWbemContext インターフェイスは、システムコンテキスト値およびその他のプロバイダー固有のコンテキスト値へのアクセスを提供します。以下に、部分インスタンス更新操作をサポートするコンテキスト値を示します。

結果セットの終わりを示すために IWbemObjectSink::SetStatus メソッドが呼び出されます。エラーが発生した場合は、 IWbemObjectSink::Indicate を一度も呼び出さずに呼び出されることもあります。

コールバックが、クライアントが要求するのと同じ認証レベルで返されるとは限らないため、非同期通信ではなく半同期通信を使用することを推奨します。非同期通信が必要な場合は、Calling a Method を参照してください。

メソッドを半同期で使用する方法の詳細については、IWbemServices::PutInstance および Calling a Method を参照してください。

システムコンテキスト値 説明
__PUT_EXTENSIONS

(VT_BOOL)

クライアントアプリケーションが、更新操作に関する追加情報を提供するために、他のシステムコンテキスト値を 1 つ以上設定しています。
__PUT_EXT_STRICT_NULLS

(VT_BOOL)

インスタンスプロバイダーは、適切な場合にプロパティを VT_NULL に設定することを強制し、失敗時にはエラーを発生させる必要があります。
__PUT_EXT_PROPERTIES

(VT_ARRAY | VT_BSTR)

更新対象のプロパティの一覧を格納します。インスタンスプロバイダーは、これ以外のプロパティをすべて無視する必要があります。
__PUT_EXT_ATOMIC

(VT_BOOL)

すべての更新が成功する必要があり、そうでない場合、インスタンスプロバイダーは元に戻す必要があります。部分的な成功は許容されません。

インスタンスプロバイダーを実装する際は、pCtx 内の NULL プロパティに対して次のように対応してください。

pCtxNULL ではなく、有効なコンテキスト情報を指している場合、呼び出し元のアプリケーションは部分インスタンス更新を要求しています。前述のとおり、部分インスタンス更新をサポートしないインスタンスプロバイダーは、WBEM_E_PROVIDER_NOT_CAPABLE を返して操作を失敗させる必要があります。

非同期操作を実装する場合、pResponseHandler に対して行った AddRef をすべて解放するまで、その非同期操作は完了しません。これは、pResponseHander に対して SetStatus を呼び出した場合でも同様です。pResponseHandler がリークすると、実装によっては、同期クライアントや半同期クライアントも完了せず、応答を停止する可能性があります。

致命的な状況であっても、分離型プロバイダーでは参照を必ず解放する必要があります。これは、同期および半同期の場合、pResponseHandler の実装を WMI サービスが所有しているためです。分離型プロバイダーのプロセスが終了しても、クライアントは応答しないままになります。

次の例は、 PutInstanceAsync の構成方法を示しています。

HRESULT CStdProvider::PutInstanceAsync( 
            /* [in] */ IWbemClassObject __RPC_FAR *pInst,
            /* [in] */ long lFlags,
            /* [in] */ IWbemContext __RPC_FAR *pCtx,
            /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
            )
{
   // You must implement the InstanceIsValid method
   // to check to see if the instance in the pInst variable
   // is valid.
   if (InstanceIsValid(lFlags, pInst)) 
   {
       return WBEM_S_NO_ERROR;
   }

   return WBEM_E_PROVIDER_NOT_CAPABLE;   
}
vtbl 16 HRESULT DeleteInstance(LPWSTR strObjectPath, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemCallResult** ppCallResult)

IWbemServices::DeleteInstance メソッドは、現在の名前空間内にある既存クラスのインスタンスを削除します。

strObjectPathLPWSTRin削除対象のインスタンスのオブジェクトパスを含む有効な BSTR
lFlagsWBEM_GENERIC_FLAG_TYPEin

次のいずれかの値を指定できます。

WBEM_FLAG_RETURN_IMMEDIATELY

このフラグを指定すると半同期呼び出しになります。詳細については、 Calling a Method を参照してください。

pCtxIWbemContext*in通常は NULL です。それ以外の場合は、インスタンスを削除するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。
ppCallResultIWbemCallResult**inoutoptionalNULL の場合、このパラメーターは使用されません。ppCallResult を指定する場合は、呼び出し時に NULL を指すように設定しておく必要があります。lFlags パラメーターに WBEM_FLAG_RETURN_IMMEDIATELY が含まれている場合、この呼び出しは WBEM_S_NO_ERROR を返してすぐに戻ります。ppCallResult パラメーターは新しい IWbemCallResult オブジェクトへのポインターを受け取り、 GetCallStatus メソッドでポーリングして結果を取得できます。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

解説(Remarks)

IWbemServices::DeleteInstance メソッドは、現在の名前空間にある既存のインスタンスを削除するために呼び出します。他の名前空間のインスタンスは削除できません。階層内のクラスに属するインスタンスを削除するために DeleteInstance が呼び出されると、Windows Management は、その階層内の非抽象クラスを担当するすべてのプロバイダーに対して DeleteInstanceAsync メソッドを呼び出します。たとえば、strObjectPath パラメーターが ClassB のインスタンスを指しており、ClassB が非抽象クラスである ClassA から派生し、かつ同じく非抽象クラスである ClassC と ClassD の親クラスである場合、これら 4 つすべてのクラスのプロバイダーが呼び出されます。

Windows Management は、各プロバイダーのクラスを指すように修正したオブジェクトパスを使って、それぞれのプロバイダーを呼び出します。たとえば、元の呼び出しにおける strObjectPath が "ClassB.k=1" である場合、ClassA のプロバイダーへの呼び出しでは strObjectPath は "ClassA.k=1" に設定されます。

DeleteInstance 呼び出しの成否は、最上位の非抽象クラスのプロバイダーに対する DeleteInstanceAsync 呼び出しの成否のみに依存します。非抽象クラスとは、抽象クラスを親に持つクラスです。そうしたクラスのプロバイダーのいずれか 1 つでも成功すれば操作は成功し、すべてが失敗した場合に操作は失敗します。

たとえば、ClassX が次の階層の基底クラスであるとします。

  1. ClassA は ClassX から派生します。
  2. ClassB は ClassA から派生します。
  3. ClassC と ClassD は ClassB から派生します。
階層内で ClassX だけが抽象クラスであり、 DeleteInstancestrObjectPath パラメーターが ClassB のインスタンスを指している場合、 DeleteInstanceAsync 呼び出しで成功する必要があるのは ClassA のプロバイダーのみです。

ClassX、ClassA、ClassB がすべて抽象クラスであり、 DeleteInstancestrObjectPath パラメーターが同じく ClassB のインスタンスを指している場合は、ClassC のプロバイダーまたは ClassD のプロバイダーのいずれかが成功する必要があります。

vtbl 17 HRESULT DeleteInstanceAsync(LPWSTR strObjectPath, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemObjectSink* pResponseHandler)

IWbemServices::DeleteInstanceAsync メソッドは、現在の名前空間内にある既存クラスのインスタンスを非同期に削除します。操作の完了確認または失敗は、呼び出し元が実装する IWbemObjectSink インターフェイスを通じて報告されます。

strObjectPathLPWSTRin削除対象のオブジェクトの オブジェクトパスを含む有効な BSTR
lFlagsWBEM_GENERIC_FLAG_TYPEinWBEM_FLAG_SEND_STATUS は、クライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を Windows Management に登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。なお、ここでは WBEM_FLAG_USE_AMENDED_QUALIFIERS フラグは使用できません。
pCtxIWbemContext*in通常は NULL です。それ以外の場合は、インスタンスを削除するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。
pResponseHandlerIWbemObjectSink*in呼び出し元による IWbemObjectSink の実装へのポインター。このハンドラーは、削除操作の状態が利用可能になった時点で SetStatus メソッドを通じてそれを受け取ります。何らかのエラーコードが返された場合、渡された IWbemObjectSink ポインターは使用されません。WBEM_S_NO_ERROR が返された場合は、操作結果を通知するためにユーザーの IWbemObjectSink 実装が呼び出されます。Windows Management がポインターに対して AddRef を呼び出すのは、WBEM_S_NO_ERROR が返される場合だけです。エラーコードが返される場合、参照カウントは呼び出し前と同じです。詳細については、 Calling a Method を参照してください。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。

DeleteInstanceAsyncWBEM_S_NO_ERROR を返した場合、WMI は応答ハンドラーの SetStatus メソッドからの結果を待機します。WMI は、ローカル接続では無期限に、リモート接続ではタイムアウトが発生するまで待機します。

その他のエラー状態は、pResponseHandler パラメーターで指定したオブジェクトシンクに非同期に報告されます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

注意 DeleteInstanceAsync を呼び出すクライアントは、呼び出しの結果が自身の IWbemObjectSink::Indicate メソッドを通じて報告されることを常に想定しておく必要があります。
注意 strObjectPath が指すインスタンスがクラス階層の一員であるクラスに属している場合、 DeleteInstanceAsync の成否は、最上位の非抽象プロバイダーに依存します。この操作の成否を決定する依存関係の詳しい説明については、 IWbemServices::DeleteInstance の「解説」を参照してください。

解説(Remarks)

インスタンスプロバイダーは、 DeleteInstanceAsync の戻りコード、または pResponseHandler を通じた SetStatus の呼び出しのいずれかで、成功または失敗を報告できます。 SetStatus に送信した場合、pResponseHandler を通じてシンクに送られた戻りコードが優先されます。コールバックが、クライアントが要求するのと同じ認証レベルで返されるとは限らないため、非同期通信ではなく半同期通信を使用することを推奨します。非同期通信が必要な場合は、Calling a Method を参照してください。

メソッドを半同期で使用する方法の詳細については、IWbemServices::DeleteInstance および Calling a Method を参照してください。

vtbl 18 HRESULT CreateInstanceEnum(LPWSTR strFilter, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IEnumWbemClassObject** ppEnum)

IWbemServices::CreateInstanceEnum メソッドは、ユーザーが指定した選択条件に従って、指定クラスのインスタンスを返す列挙子を作成します。

strFilterLPWSTRinインスタンスを取得したいクラスの名前を含む有効な BSTR。このパラメーターを NULL にすることはできません。
lFlagsWBEM_GENERIC_FLAG_TYPEin

次のフラグがこのメソッドの動作に影響します。最良のパフォーマンスを得るには、このパラメーターに WBEM_FLAG_RETURN_IMMEDIATELYWBEM_FLAG_FORWARD_ONLY を指定することを推奨します。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

このフラグを設定すると、WMI は現在の接続のロケールに対応するローカライズ済み名前空間に格納されている amended 修飾子を取得します。設定しない場合は、直近の名前空間に格納されている修飾子のみが取得されます。

WBEM_FLAG_DEEP

このフラグを指定すると、このクラスと階層内のすべてのサブクラスが列挙に含まれます。

WBEM_FLAG_SHALLOW

このフラグを指定すると、このクラスに存在しないプロパティを提供するサブクラスのインスタンスをすべて除外し、このクラス自体のインスタンスのみが列挙に含まれます。

WBEM_FLAG_RETURN_IMMEDIATELY

このフラグを指定すると半同期呼び出しになります。詳細については、 Calling a Method を参照してください。

WBEM_FLAG_FORWARD_ONLY

このフラグを指定すると、前方参照専用の列挙子が返されます。前方参照専用の列挙子は一般に、従来の列挙子よりはるかに高速でメモリ使用量も少なくなりますが、 CloneReset を呼び出すことはできません。

WBEM_FLAG_BIDIRECTIONAL

このフラグを指定すると、クライアントが列挙子を解放するまで、Windows Management は列挙対象オブジェクトへのポインターを保持します。オブジェクトのポインターがすぐには解放されないため、クライアントが大量のオブジェクトを列挙しようとすると、このメソッドは WBEM_E_OUT_OF_MEMORYhResult で失敗する可能性があります。lFlags パラメーターに 0 (ゼロ) を設定した場合、既定でこのフラグが適用されます。

WBEM_FLAG_DIRECT_READ

このフラグを指定すると、親クラスやサブクラスを考慮せずに、指定したクラスのプロバイダーに直接アクセスします。

pCtxIWbemContext*in通常は NULL です。それ以外の場合は、要求されたインスタンスを提供するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
ppEnumIEnumWbemClassObject**out列挙子へのポインターを受け取ります。参照カウントは 1 以上です。呼び出し元は、不要になった時点でこのポインターに対して IUnknown::Release を呼び出す必要があります。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

解説(Remarks)

返された列挙子の要素数が 0 であっても、エラーではありません。

vtbl 19 HRESULT CreateInstanceEnumAsync(LPWSTR strFilter, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemObjectSink* pResponseHandler)

IWbemServices::CreateInstanceEnumAsync メソッドは、ユーザーが指定した選択条件に従って、指定クラスのインスタンスを非同期に返す列挙子を作成します。

strFilterLPWSTRinインスタンスを取得したいクラスの名前を含む有効な BSTR。このパラメーターを NULL にすることはできません。
lFlagsWBEM_GENERIC_FLAG_TYPEin

このパラメーターには次のいずれかの値を指定できます。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

このフラグを設定すると、Windows Management Instrumentation (WMI) は現在の接続のロケールに対応するローカライズ済み名前空間に格納されている amended 修飾子を取得します。設定しない場合は、直近の名前空間に格納されている修飾子のみが取得されます。

WBEM_FLAG_DEEP

このフラグを指定すると、このクラスと階層内のすべてのサブクラスのインスタンスが列挙に含まれます。

WBEM_FLAG_SHALLOW

このフラグを指定すると、このクラスに存在しないプロパティを提供するサブクラスのインスタンスをすべて除外し、このクラス自体のインスタンスのみが列挙に含まれます。

WBEM_FLAG_SEND_STATUS

このフラグは、クライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を Windows Management に登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。

WBEM_FLAG_BIDIRECTIONAL

このフラグを指定すると、クライアントが列挙子を解放するまで、Windows Management は列挙対象オブジェクトへのポインターを保持します。

WBEM_FLAG_DIRECT_READ

このフラグを指定すると、親クラスやサブクラスを考慮せずに、指定したクラスのプロバイダーに直接アクセスします。

pCtxIWbemContext*in通常は NULL です。それ以外の場合は、要求されたインスタンスを返すプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。詳細については、 Making Calls to WMI を参照してください。
pResponseHandlerIWbemObjectSink*in呼び出し元による IWbemObjectSink の実装へのポインター。このハンドラーは、オブジェクトが利用可能になるたびにそれらを受け取ります。何らかのエラーコードが返された場合、渡された IWbemObjectSink ポインターは使用されません。WBEM_S_NO_ERROR が返された場合は、操作結果を通知するためにユーザーの IWbemObjectSink 実装が呼び出されます。Windows Management がポインターに対して AddRef を呼び出すのは、WBEM_S_NO_ERROR が返される場合だけです。エラーコードが返される場合、参照カウントは呼び出し前と同じです。詳細については、 Calling a Method を参照してください。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から詳細情報を取得できます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

インスタンスプロバイダーは、 CreateInstanceEnumAsync の戻りコード、または pResponseHandler を通じた SetStatus の呼び出しのいずれかで、成功または失敗を報告できます。 SetStatus を呼び出すことを選択した場合、pResponseHandler を通じて送られた戻りコードが優先されます。

CreateInstanceEnumAsyncWBEM_S_NO_ERROR を返した場合、WMI は応答ハンドラーの SetStatus メソッドからの結果を待機します。WMI は、ローカル接続では無期限に、リモート接続ではタイムアウトが発生するまで待機します。

解説(Remarks)

結果セットの終わりを示すために IWbemObjectSink::SetStatus メソッドが呼び出されます。エラーが発生した場合は、 IWbemObjectSink::Indicate を一度も呼び出さずに呼び出されることもあります。

コールバックが、クライアントが要求するのと同じ認証レベルで返されるとは限らないため、非同期通信ではなく半同期通信を使用することを推奨します。

詳細については、IWbemServices::CreateInstanceEnum および Calling a Method を参照してください。

次の例は、 CreateInstanceEnumAsync を実装する方法を示しています。

#define NUM_OF_INSTANCES 3

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

    // Assume there is an IWbemServices pointer available to
    // retrieve the class definition.
    HRESULT hRes = m_pSvc->GetObject(strClass, 0, NULL, &pClass, 0);
    if (hRes)
        return hRes;

    // Now loop through the private source and create each instance.
    for (int i = 0; i < NUM_OF_INSTANCES; i++)
    {
         // Prepare an empty object to receive the class definition.
         pClass->SpawnInstance(0, &pNextInst);

         // Create the instance.
         // For example, create the instance in a
         // FillInst method you implement:
         /*FillInst(pNextInst);*/

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

    // Send a finish message to WMI.
    pResponseHandler->SetStatus(0, WBEM_S_NO_ERROR, 0, 0);

    // Free memory resources.
    SysFreeString(strClass);
    pClass->Release();
    m_pSvc->Release();

    return WBEM_S_NO_ERROR;
}

上記の例では、インスタンスプロバイダーは必要な処理を行うために WMI からスレッドを取得しています。シンクの AddRef メソッドを呼び出し、結果セットのオブジェクトを配信するために別のスレッドを作成することもできます。別のスレッドを作成すると、スレッドプールを消費することなく現在のスレッドを WMI に返すことができます。プロバイダーが単一スレッド設計と二重スレッド設計のどちらを選ぶかは、プロバイダーが WMI のスレッドをどれだけの時間使用する予定かによって決まります。固定的な規則はありません。実験を通じて、設計が WMI のパフォーマンスにどのような影響を与えるかを確認するとよいでしょう。

vtbl 20 HRESULT ExecQuery(LPWSTR strQueryLanguage, LPWSTR strQuery, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IEnumWbemClassObject** ppEnum)

IWbemServices::ExecQuery メソッドは、オブジェクトを取得するためのクエリを実行します。

strQueryLanguageLPWSTRinWindows Management がサポートするクエリ言語のいずれかを含む有効な BSTR。これは、WMI Query Language の略称である "WQL" でなければなりません。
strQueryLPWSTRinクエリのテキストを含む有効な BSTR。このパラメーターを NULL にすることはできません。WMI のクエリ文字列を組み立てる方法の詳細については、Querying with WQL および WQL リファレンスを参照してください。
lFlagsWBEM_GENERIC_FLAG_TYPEin

次のフラグがこのメソッドの動作に影響します。最良のパフォーマンスを得るには、このパラメーターに WBEM_FLAG_RETURN_IMMEDIATELYWBEM_FLAG_FORWARD_ONLY を指定することを推奨します。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

このフラグを設定すると、WMI は現在の接続のロケールに対応するローカライズ済み名前空間に格納されている amended 修飾子を取得します。設定しない場合は、直近の名前空間に格納されている修飾子のみが取得されます。

WBEM_FLAG_FORWARD_ONLY

このフラグを指定すると、前方参照専用の列挙子が返されます。前方参照専用の列挙子は一般に、従来の列挙子よりはるかに高速でメモリ使用量も少なくなりますが、 CloneReset を呼び出すことはできません。

WBEM_FLAG_BIDIRECTIONAL

このフラグを指定すると、クライアントが列挙子を解放するまで、Windows Management は列挙対象オブジェクトへのポインターを保持します。

WBEM_FLAG_RETURN_IMMEDIATELY

このフラグを指定すると半同期呼び出しになります。詳細については、 Calling a Method を参照してください。

WBEM_FLAG_ENSURE_LOCATABLE

このフラグは、返されるオブジェクトが、__PATH__RELPATH__SERVER などのシステムプロパティが NULL にならないだけの十分な情報を含むことを保証します。

WBEM_FLAG_PROTOTYPE

このフラグはプロトタイピングに使用します。クエリは実行されず、代わりに典型的な結果オブジェクトのように見えるオブジェクトが返されます。

WBEM_FLAG_DIRECT_READ

このフラグを指定すると、親クラスやサブクラスを考慮せずに、指定したクラスのプロバイダーに直接アクセスします。

pCtxIWbemContext*in通常は NULL です。それ以外の場合は、要求されたクラスまたはインスタンスを提供するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
ppEnumIEnumWbemClassObject**outエラーが発生しなかった場合、呼び出し元がクエリの結果セットに含まれるインスタンスを取得するための列挙子を受け取ります。クエリの結果セットに含まれるインスタンスが 0 個であってもエラーではありません。これは、インスタンスを反復処理してみて初めて判明します。このオブジェクトは参照カウントが 1 以上の状態で返されます。呼び出し元は、オブジェクトが不要になった時点で Release を呼び出す必要があります。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

解説(Remarks)

IWbemServices::ExecQuery メソッドは、strQuery パラメーターで指定されたクエリを処理し、呼び出し元がクエリ結果にアクセスするための列挙子を作成します。列挙子は IEnumWbemClassObject インターフェイスへのポインターです。クエリ結果はクラスオブジェクトのインスタンスであり、 IWbemClassObject インターフェイスを通じて利用できます。

WQL クエリで使用できる "AND" および "OR" キーワードの数には上限があります。複雑なクエリで多数の WQL キーワードを使用すると、WMI が HRESULT 値として WBEM_E_QUOTA_VIOLATION エラーコードを返すことがあります。WQL キーワードの上限は、クエリの複雑さによって変わります。

vtbl 21 HRESULT ExecQueryAsync(LPWSTR strQueryLanguage, LPWSTR strQuery, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemObjectSink* pResponseHandler)

IWbemServices::ExecQueryAsync メソッドは、オブジェクトを非同期に取得するためのクエリを実行します。

strQueryLanguageLPWSTRinWindows Management Instrumentation (WMI) がサポートするクエリ言語のいずれかを含む有効な BSTR。これは "WQL" でなければなりません。
strQueryLPWSTRin

クエリのテキストを含む有効な BSTR。これを NULL にすることはできません。インスタンスプロバイダーを実装する際、クエリが複雑すぎる場合はプロバイダーがそのクエリを拒否できます。プロバイダーがクエリを複雑すぎると判断した場合、WMI はより単純なクエリでプロバイダーを再試行するか、クエリ対象インスタンスの上位集合を取得して列挙することを選択できます。

WMI のクエリ文字列を組み立てる方法の詳細については、 Querying with WQL および WQL リファレンスを参照してください。

lFlagsWBEM_GENERIC_FLAG_TYPEin

このパラメーターには次のいずれかの値を指定できます。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

このフラグを設定すると、WMI は現在の接続のロケールに対応するローカライズ済み名前空間に格納されている amended 修飾子を取得します。設定しない場合は、直近の名前空間に格納されている修飾子のみが取得されます。

WBEM_FLAG_BIDIRECTIONAL

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

WBEM_FLAG_SEND_STATUS

このフラグは、クライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を WMI に登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。

WBEM_FLAG_ENSURE_LOCATABLE

このフラグは、返されるオブジェクトが、__PATH__RELPATH__SERVER などのシステムプロパティが NULL にならないだけの十分な情報を含むことを保証します。

WBEM_FLAG_PROTOTYPE

このフラグはプロトタイピングに使用します。クエリは実行されず、典型的な結果オブジェクトのように見えるオブジェクトが返されます。

WBEM_FLAG_DIRECT_READ

このフラグを指定すると、親クラスやサブクラスを考慮せずに、指定したクラスのプロバイダーに直接アクセスします。

pCtxIWbemContext*in通常は NULL です。それ以外の場合は、要求されたクラスまたはインスタンスを返すためにプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
pResponseHandlerIWbemObjectSink*in

呼び出し元による IWbemObjectSink の実装へのポインター。このハンドラーは、クエリの結果セットに含まれるオブジェクトを、利用可能になるたびに受け取ります。何らかのエラーコードが返された場合、渡された IWbemObjectSink ポインターは使用されません。WBEM_S_NO_ERROR が返された場合は、操作結果を通知するためにユーザーの IWbemObjectSink 実装が呼び出されます。Windows Management Instrumentation (WMI) は、オブジェクトとともに IWbemObjectSink::Indicate を任意の回数呼び出し、その後、最終状態を示すために IWbemObjectSink::SetStatus を 1 回だけ呼び出します。

WMI がポインターに対して AddRef を呼び出すのは、WBEM_S_NO_ERROR が返される場合だけです。エラーコードが返される場合、参照カウントは呼び出し前と同じです。非同期呼び出しメソッドの詳しい説明については、 Calling a Method を参照してください。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から情報を取得できます。

その他のエラーコードは、pResponseHandler パラメーターで指定したオブジェクトシンクに返されます。

ネットワークの問題により WMI へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

処理完了時、インスタンスプロバイダーは、 ExecQueryAsync の戻りコード、または pResponseHandler を通じた SetStatus の呼び出しのいずれかで、成功または失敗を報告できます。 SetStatus を呼び出すことを選択した場合、pResponseHandler を通じて送られた戻りコードが優先されます。

解説(Remarks)

WQL クエリで使用できる AND および OR キーワードの数には上限があります。複雑なクエリで多数の WQL キーワードを使用すると、WMI が HRESULT 値として WBEM_E_QUOTA_VIOLATION エラーコードを返すことがあります。WQL キーワードの上限は、クエリの複雑さによって変わります。

中間状態を報告するために、呼び出し元の IWbemObjectSink::Indicate メソッドが呼び出されることがあります。結果セットの終わりを示すために IWbemObjectSink::SetStatus メソッドが呼び出されます。

プロバイダーがクエリ処理をサポートしない場合は、WMI がこれを代行できます。ただし、通常はプロバイダー自身によるクエリ処理の実装のほうが、WMI による処理よりも効率的です。クエリをサポートするには、インスタンスプロバイダーが ExecQueryAsync メソッドを実装する必要があります。プロバイダーが ExecQueryAsync をサポートしている場合、WMI は単純な単項 SELECT クエリを strQuery パラメーターを通じてプロバイダーに直接送信し、プロバイダーはそのクエリを解析して該当するインスタンスを返す必要があります。WMI はクエリを一切変更しない (WQL で記述されたクエリであっても) ため、プロバイダー側で解析が必要になります。

クエリ処理に WMI を使用するには、__InstanceProviderRegistrationQuerySupportLevels プロパティを設定しないでください。そうすると、WMI は CreateInstanceEnumAsync の実装を呼び出し、その結果を事後フィルタリングして、クエリ条件を満たすインスタンスだけが呼び出し元に渡されるようにします。

次の例は、インスタンスプロバイダーによる ExecQueryAsync の典型的な実装を示しています。結果セットの終わりを示すために IWbemObjectSink::SetStatus メソッドが呼び出されます。エラーが発生した場合は、 IWbemObjectSink::Indicate を一度も呼び出さずに呼び出されることもあります。

コールバックが、クライアントが要求するのと同じ認証レベルで返されるとは限らないため、非同期通信ではなく半同期通信を使用することを推奨します。非同期通信が必要な場合は、Calling a Method を参照してください。

詳細については、IWbemServices::ExecQuery および Calling a Method を参照してください。

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

// Parse the query.
//   You must implement ParseQuery().
    if (!ParseQuery(strQuery))  return WBEM_E_PROVIDER_NOT_CAPABLE;   

// Assume there is an IWbemServices pointer (m_pSvc) available to 
// retrieve the class definition.
    
    HRESULT hRes = m_pSvc->GetObject(L"ClassName", 0, NULL, &pClass, 0);
    if (FAILED(hRes))
        return hRes;

// Call a method to determine number of instances returned.
// You need to implement the GetNumberInst function.
    int iNumInst = GetNumberInst();

// Now loop through the private source and create each   
// instance which is part of the result set of the query.
    for (int iCnt = 0 ; iCnt < iNumInst ; iCnt++)
    {
// Prepare an empty object to receive the class definition.
         IWbemClassObject *pNextInst = 0;
         hRes = pClass->SpawnInstance(0, &pNextInst);

// Create the instance.
//   You must implement FillInst().
         /*FillInst(pNextInst, iCnt);*/ 

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

// Clean up memory
    pClass->Release();
  
// Send finish message to WMI.

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

    return hRes;
}

上記の例では、インスタンスプロバイダーは必要な同期処理を行うために WMI からスレッドを取得しています。シンクの AddRef メソッドを呼び出し、結果セットのオブジェクトを配信するために別のスレッドを作成することもできます。別のスレッドを作成すると、スレッドプールを消費することなく現在のスレッドを WMI に返すことができます。プロバイダーが単一スレッド設計と二重スレッド設計のどちらを選ぶかは、プロバイダーが WMI のスレッドをどれだけの時間使用する予定かによって決まります。固定的な規則はありません。実験を通じて、設計が WMI のパフォーマンスにどのような影響を与えるかを確認するとよいでしょう。

注意 プロバイダーが ExecQueryAsync を実装する場合、既定では、クエリに基づく正しい結果セットを返すことが期待されます。プロバイダーが正しい結果セットを容易に返せない場合は、結果の上位集合を返したうえで、結果セットが正しくなるようにオブジェクトをクライアントへ配信する前に WMI が事後フィルタリングを行うよう要求できます。これを行うには、プロバイダーは自身の ExecQueryAsync 実装に渡されたシンクに対して、次のフラグを指定して SetStatus を呼び出します。
// The pSink variable is of type IWbemObjectSink*
pSink->SetStatus(WBEM_STATUS_REQUIREMENTS,
    WBEM_REQUIREMENTS_START_POSTFILTER, 0, 0);
注意 以降、WMI サービスに送信されるオブジェクトはすべてフィルタリングされます。プロバイダーは、次の呼び出しを使用して、処理の途中で事後フィルタリングを無効にできます。
// The pSink variable is of type IWbemObjectSink*
pSink->SetStatus(WBEM_STATUS_REQUIREMENTS, 
    WBEM_REQUIREMENTS_STOP_POSTFILTER, 0, 0);
vtbl 22 HRESULT ExecNotificationQuery(LPWSTR strQueryLanguage, LPWSTR strQuery, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IEnumWbemClassObject** ppEnum)

IWbemServices::ExecNotificationQuery メソッドは、イベントを受信するためのクエリを実行します。この呼び出しはすぐに戻り、ユーザーは返された列挙子をポーリングして、到着したイベントを取得できます。返された列挙子を解放すると、クエリはキャンセルされます。

strQueryLanguageLPWSTRinWindows Management がサポートするクエリ言語のいずれかを含む有効な BSTR。これを NULL にすることはできません。現在サポートされているのは WMI Query Language (WQL) のみです。
strQueryLPWSTRinイベント関連のクエリのテキストを含む有効な BSTR。これを NULL にすることはできません。WMI のクエリ文字列を組み立てる方法の詳細については、Querying with WQL および WQL リファレンスを参照してください。
lFlagsWBEM_GENERIC_FLAG_TYPEin

このパラメーターには WBEM_FLAG_RETURN_IMMEDIATELYWBEM_FLAG_FORWARD_ONLY の両方を設定する必要があります。設定しない場合、呼び出しは失敗します。

WBEM_FLAG_FORWARD_ONLY

このフラグを指定すると、前方参照専用の列挙子が返されます。前方参照専用の列挙子は一般に、従来の列挙子よりはるかに高速でメモリ使用量も少なくなりますが、 CloneReset を呼び出すことはできません。

WBEM_FLAG_RETURN_IMMEDIATELY

ユーザーはこのフラグを指定する必要があります。指定しない場合、呼び出しは失敗します。これは、イベントが継続的に受信されるため、ユーザーが返された列挙子をポーリングする必要があるからです。発生するかどうか分からないイベントを待って、この呼び出しを無期限にブロックすると、スレッドが不定の時間ブロックされてしまいます。詳細については、 Calling a Method を参照してください。

pCtxIWbemContext*in通常は NULL です。それ以外の場合は、要求されたイベントを提供するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
ppEnumIEnumWbemClassObject**outエラーが発生しなかった場合、このパラメーターは、呼び出し元がクエリの結果セットに含まれるインスタンスを取得するための列挙子を受け取ります。呼び出し元は、イベントが利用可能かどうかを確認するために、定期的に IEnumWbemClassObject::Next を呼び出します。この用法では、 Reset は列挙子をイベントシーケンスの先頭に戻さず、何の効果もない点に注意してください。このパラメーターは、返された列挙子に対して Release が呼び出されるまで、イベントを受信し続けることができます。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

解説(Remarks)

WQL クエリで使用できる AND および OR キーワードの数には上限があります。複雑なクエリで多数の WQL キーワードを使用すると、WMI が HRESULT 値として WBEM_E_QUOTA_VIOLATION エラーコードを返すことがあります。WQL キーワードの上限は、クエリの複雑さによって変わります。

vtbl 23 HRESULT ExecNotificationQueryAsync(LPWSTR strQueryLanguage, LPWSTR strQuery, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemObjectSink* pResponseHandler)

IWbemServices::ExecNotificationQueryAsync メソッドは IWbemServices::ExecNotificationQuery と同じ処理を行いますが、イベント通知を停止するために CancelAsyncCall が呼び出されるまで、指定した応答ハンドラーにイベントが供給される点が異なります。

strQueryLanguageLPWSTRinWindows Management がサポートするクエリ言語のいずれかを含む有効な BSTR。これは "WQL" でなければなりません。
strQueryLPWSTRinイベント関連のクエリのテキストを含む有効な BSTR。これを NULL にすることはできません。WMI のクエリ文字列を組み立てる方法の詳細については、Querying with WQL および WQL リファレンスを参照してください。
lFlagsWBEM_GENERIC_FLAG_TYPEin

このパラメーターには次の値を指定できます。

WBEM_FLAG_SEND_STATUS

このフラグは、クライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を Windows Management に登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。

pCtxIWbemContext*in通常は NULL です。それ以外の場合は、要求されたイベントを返すプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
pResponseHandlerIWbemObjectSink*in呼び出し元による IWbemObjectSink の実装へのポインター。このハンドラーは、クエリの結果セットに含まれるオブジェクトを、利用可能になるたびに受け取ります。イベントの受信を停止するには、呼び出し元は pResponseHandler と同じポインター値を使用して IWbemServices::CancelAsyncCall を呼び出す必要があります。イベントが利用可能になるたびに、イベントオブジェクトを配信するために、渡された IWbemObjectSink::Indicate の実装が呼び出されます。最終条件や終了条件が存在しないため、 IWbemObjectSink::SetStatus メソッドは一切呼び出されません。この呼び出しは、キャンセルされるまで無期限に実行されます。何らかのエラーコードが返された場合、渡された IWbemObjectSink ポインターは使用されません。WBEM_S_NO_ERROR が返された場合は、操作結果を通知するためにユーザーの IWbemObjectSink 実装が呼び出されます。Windows Management がポインターに対して AddRef を呼び出すのは、WBEM_S_NO_ERROR が返される場合だけです。エラーコードが返される場合、参照カウントは呼び出し前と同じです。このパラメーターの詳しい説明については、 Calling a Method を参照してください。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。

その他のエラーコードは、pResponseHandler パラメーターで指定したオブジェクトシンクに返されます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

解説(Remarks)

結果セットの終わりを示すために IWbemObjectSink::SetStatus メソッドが呼び出されます。エラーが発生した場合は、 IWbemObjectSink::Indicate を一度も呼び出さずに呼び出されることもあります。

コールバックが、クライアントが要求するのと同じ認証レベルで返されるとは限らないため、非同期通信ではなく半同期通信を使用することを推奨します。非同期通信が必要な場合は、Calling a Method を参照してください。

メソッドを半同期で使用する方法の詳細については、IWbemServices::ExecNotificationQuery および Calling a Method を参照してください。

WQL クエリで使用できる AND および OR キーワードの数には上限があります。複雑なクエリで多数の WQL キーワードを使用すると、WMI が HRESULT 値として WBEM_E_QUOTA_VIOLATION エラーコードを返すことがあります。WQL キーワードの上限は、クエリの複雑さによって変わります。

vtbl 24 HRESULT ExecMethod(LPWSTR strObjectPath, LPWSTR strMethodName, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemClassObject* pInParams, IWbemClassObject** ppOutParams, IWbemCallResult** ppCallResult)

CIM オブジェクトがエクスポートするメソッドを実行します。

strObjectPathLPWSTRinメソッドを実行する対象オブジェクトの オブジェクトパスを含む有効な BSTR
strMethodNameLPWSTRinオブジェクトのメソッドの名前。
lFlagsWBEM_GENERIC_FLAG_TYPEinこのパラメーターに 0 を設定すると同期呼び出しになります。半同期呼び出しにするには、lFlagsWBEM_FLAG_RETURN_IMMEDIATELY を設定し、ppCallResult パラメーターに有効なポインターを渡します。この場合、呼び出しはすぐに戻ります。詳細については、 Calling a Method を参照してください。
pCtxIWbemContext*in通常は NULL です。それ以外の場合は、メソッドを実行するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
pInParamsIWbemClassObject*inメソッドの実行に入力パラメーターが不要な場合は NULL でもかまいません。それ以外の場合は、メソッド実行時の入力パラメーターとして機能するプロパティを含む IWbemClassObject を指します。このオブジェクトの内容はメソッドごとに異なり、該当するプロバイダーの仕様の一部です。入力パラメーターの構築方法の詳細については、Creating Parameters Objects in C++ を参照してください。
ppOutParamsIWbemClassObject**inoutoptionalNULL でない場合、メソッド実行の出力パラメーターと戻り値へのポインターを受け取ります。このオブジェクトの内容はメソッドごとに異なり、該当するプロバイダーの仕様の一部です。呼び出し元は、返されたオブジェクトが不要になった時点で Release を呼び出す必要があります。
ppCallResultIWbemCallResult**inoutoptionalNULL の場合、このパラメーターは使用されません。ppCallResult を指定する場合は、呼び出し時に NULL を指すように設定しておく必要があります。この場合、呼び出しは WBEM_S_NO_ERROR を返してすぐに戻ります。ppCallResult パラメーターは新しい IWbemCallResult オブジェクトへのポインターを受け取ります。メソッド実行の結果を取得するには、 GetCallStatus メソッドでこれをポーリングする必要があります。呼び出しの出力パラメーターは、 IWbemCallResult::GetResultObject を呼び出して取得できます。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。

ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

解説(Remarks)

ppOutParamsNULL でない場合、クライアントは ppOutParams が指すオブジェクトの ReturnValue プロパティを調べることで、メソッドの戻り値の型を判別できます。

vtbl 25 HRESULT ExecMethodAsync(LPWSTR strObjectPath, LPWSTR strMethodName, WBEM_GENERIC_FLAG_TYPE lFlags, IWbemContext* pCtx, IWbemClassObject* pInParams, IWbemObjectSink* pResponseHandler)

CIM オブジェクトがエクスポートするメソッドを非同期に実行します。

strObjectPathLPWSTRinメソッドを実行する対象オブジェクトの オブジェクトパスを含む有効な BSTR。静的メソッドは、クラス名またはインスタンスへのオブジェクトパスのいずれかを使用して呼び出すことができます。メソッドプロバイダーは、オブジェクトパスのパラメーターを解析して、メソッド定義を含むクラスとインスタンスを判別できます。
strMethodNameLPWSTRinオブジェクトのメソッドの名前。
lFlagsWBEM_GENERIC_FLAG_TYPEinWBEM_FLAG_SEND_STATUS は、クライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を Windows Management に登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。なお、ここでは WBEM_FLAG_USE_AMENDED_QUALIFIERS フラグは使用できません。
pCtxIWbemContext*in通常は NULL です。それ以外の場合は、メソッドを実行するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。
pInParamsIWbemClassObject*inメソッドの実行に入力パラメーターが不要な場合は NULL でもかまいません。それ以外の場合は、メソッド実行時の入力パラメーターとして機能するプロパティを含む IWbemClassObject オブジェクトを指します。このオブジェクトの内容はメソッドごとに異なり、該当するプロバイダーの仕様の一部です。ただし、最も一般的なオブジェクトは __Parameters システムクラスのインスタンスです。呼び出すメソッドの入力パラメーターごとに、非システムプロパティが 1 つ存在します。メソッドプロバイダーは、メソッド内の各パラメーターに付与された ID 修飾子を無視します。これらは通常、ブラウザーや類似のアプリケーションでのみ使用されます。
pResponseHandlerIWbemObjectSink*inNULL にすることはできません。このオブジェクトシンクがメソッド呼び出しの結果を受け取ります。出力パラメーターは IWbemObjectSink::Indicate に送られます。最も一般的な戻りオブジェクトは __Parameters システムクラスのインスタンスです。戻りコードの詳細については、「解説」セクションを参照してください。メソッドプロバイダーを実装する際は、最終状態を報告するために IWbemObjectSink::SetStatus を呼び出す前に、出力パラメーターの情報を返すために Indicate を呼び出してください。

戻り値

このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。

失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。

その他のエラーは、pReponseHandler パラメーターで指定したオブジェクトシンクに非同期に報告されます。

ネットワークの問題により WMI へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。

解説(Remarks)

1 つのメソッドプロバイダーが、多数のクラスやインスタンスにメソッドを提供できます。メソッドプロバイダーは、最大 3 種類の戻り値を扱う必要があります。

結果セットの終わりを示すために IWbemObjectSink::SetStatus メソッドが呼び出されます。エラーが発生した場合は、 IWbemObjectSink::Indicate を一度も呼び出さずに呼び出されることもあります。

コールバックが、クライアントが要求するのと同じ認証レベルで返されるとは限らないため、非同期通信ではなく半同期通信を使用することを推奨します。非同期通信が必要な場合は、Calling a Method を参照してください。

戻り値 説明
ExecMethodAsync (必須) pInParams パラメーターが指すメソッドの入力パラメーターが有効かどうかを示します。
呼び出されたメソッド (省略可能) メソッドに依存します。戻り値は、出力パラメーターを表す __PARAMETERS インスタンスの ReturnValue プロパティに格納され、 Indicate の呼び出しを通じて返されます。
呼び出されたメソッドの出力パラメーター (省略可能) メソッドに依存します。出力パラメーターは __PARAMETERS インスタンスの非システムプロパティに格納され、 Indicate を通じて返されます。

次の C++ の例は、TestMeth クラスの Echo メソッドに対して IWbemServices::ExecMethodAsync メソッドを実装する方法を示しています。TestMeth クラスは、入力パラメーターと出力パラメーターをそれぞれ 1 つ持ち、符号なし 32 ビット整数を返すメソッドをサポートしています。この実装では、Echo という名前のメソッドが 1 つだけ存在し、それを含むクラスも 1 つだけであることを前提としています。簡潔にするため、エラーチェックとオブジェクトパスの解析は行っていません。

STDMETHODIMP CMyMethodProvider::ExecMethodAsync(BSTR ObjectPath, 
    BSTR MethodName, long lFlags, IWbemContext* pCtx, 
    IWbemClassObject* pInParams, IWbemObjectSink* pResultSink)
{
    HRESULT hr;
    IWbemClassObject * pClass = NULL;
    IWbemClassObject * pOutClass = NULL;
    IWbemClassObject* pOutParams;

    // Allocate some BSTRs.

    BSTR ClassName = SysAllocString(L"TestMeth");    
    BSTR InputArgName = SysAllocString(L"sInArg");
    BSTR OutputArgName = SysAllocString(L"sOutArg");
    BSTR retValName = SysAllocString(L"ReturnValue");

    // Get the class object; this is hard-coded and matches the class
    // in the MOF.  A more sophisticated example would parse 
    // ObjectPath to determine the class and possibly the instance.
    // The m_pWbemSvcs pointer is of type IWbemServices*
    hr = m_pWbemSvcs->GetObject(ClassName, 0, pCtx, &pClass, NULL);

    // This method returns values, and so creates an instance of the
    // output argument class.

    hr = pClass->GetMethod(MethodName, 0, NULL, &pOutClass);
    pOutClass->SpawnInstance(0, &pOutParams);

    // Copy the input argument into the output object.

    VARIANT var;
    VariantInit(&var);

    // Get the input argument.
    pInParams->Get(InputArgName, 0, &var, NULL, NULL);   

    // Put it into the output object.
    pOutParams->Put(OutputArgName , 0, &var, 0);      

    long lLen = wcslen(var.bstrVal);
    VariantClear(&var);
    var.vt = VT_I4;
    var.lVal = lLen;
    // Special name for the return value.
    pOutParams->Put(retValName , 0, &var, 0); 

    // Send the output object back to the client by the sink. Then 
    // release the pointers and free the strings.

    hr = pResultSink->Indicate(1, &pOutParams);
    pOutParams->Release();
    pOutClass->Release();
    pClass->Release();
    SysFreeString(ClassName);
    SysFreeString(InputArgName);
    SysFreeString(OutputArgName);
    SysFreeString(retValName);
 
    // All done; now set the status.

    hr = pResultSink->SetStatus(0,WBEM_S_NO_ERROR,NULL,NULL);
    return WBEM_S_NO_ERROR;
}
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

#define global IID_IWbemServices "{9556DC99-828C-11CF-A37E-00AA003240C7}"
#usecom global IWbemServices IID_IWbemServices "{}"
#comfunc global IWbemServices_OpenNamespace               3 wstr,int,sptr,sptr,sptr
#comfunc global IWbemServices_CancelAsyncCall             4 sptr
#comfunc global IWbemServices_QueryObjectSink             5 int,sptr
#comfunc global IWbemServices_GetObject                   6 wstr,int,sptr,sptr,sptr
#comfunc global IWbemServices_GetObjectAsync              7 wstr,int,sptr,sptr
#comfunc global IWbemServices_PutClass                    8 sptr,int,sptr,sptr
#comfunc global IWbemServices_PutClassAsync               9 sptr,int,sptr,sptr
#comfunc global IWbemServices_DeleteClass                 10 wstr,int,sptr,sptr
#comfunc global IWbemServices_DeleteClassAsync            11 wstr,int,sptr,sptr
#comfunc global IWbemServices_CreateClassEnum             12 wstr,int,sptr,sptr
#comfunc global IWbemServices_CreateClassEnumAsync        13 wstr,int,sptr,sptr
#comfunc global IWbemServices_PutInstance                 14 sptr,int,sptr,sptr
#comfunc global IWbemServices_PutInstanceAsync            15 sptr,int,sptr,sptr
#comfunc global IWbemServices_DeleteInstance              16 wstr,int,sptr,sptr
#comfunc global IWbemServices_DeleteInstanceAsync         17 wstr,int,sptr,sptr
#comfunc global IWbemServices_CreateInstanceEnum          18 wstr,int,sptr,sptr
#comfunc global IWbemServices_CreateInstanceEnumAsync     19 wstr,int,sptr,sptr
#comfunc global IWbemServices_ExecQuery                   20 wstr,wstr,int,sptr,sptr
#comfunc global IWbemServices_ExecQueryAsync              21 wstr,wstr,int,sptr,sptr
#comfunc global IWbemServices_ExecNotificationQuery       22 wstr,wstr,int,sptr,sptr
#comfunc global IWbemServices_ExecNotificationQueryAsync  23 wstr,wstr,int,sptr,sptr
#comfunc global IWbemServices_ExecMethod                  24 wstr,wstr,int,sptr,sptr,sptr,sptr
#comfunc global IWbemServices_ExecMethodAsync             25 wstr,wstr,int,sptr,sptr,sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。