IWbemServices
COM公式ドキュメント
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。
IWbemServices::OpenNamespace メソッドは、指定した子名前空間を操作コンテキストとする新しい IWbemServices ポインターを呼び出し元に提供します。
| strNamespace | LPWSTR | in | 対象となる名前空間へのパス。詳細については、 Creating Hierarchies within WMI を参照してください。この名前空間は、 IWbemServices インターフェイスポインターに関連付けられている現在の名前空間からの相対パスでのみ指定できます。このパラメーターに絶対パスや NULL を指定することはできません。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | このパラメーターに 0 を設定すると同期呼び出しになります。半同期呼び出しにするには、lFlags に WBEM_FLAG_RETURN_IMMEDIATELY を設定し、ppResult パラメーターに有効なポインターを渡します。この場合、呼び出しはすぐに戻ります。詳細については、 Calling a Method を参照してください。 |
| pCtx | IWbemContext* | in | 予約されています。このパラメーターは NULL でなければなりません。 |
| ppWorkingNamespace | IWbemServices** | inoutoptional | 新しい名前空間コンテキストを表すオブジェクトを受け取ります。返されるポインターの参照カウントは 1 以上です。呼び出し元は、不要になった時点でこのポインターに対して Release を呼び出す必要があります。エラーが発生した場合、このポインターは NULL に設定されます。このパラメーターを指定する場合、ppResult は NULL でなければなりません。 |
| ppResult | IWbemCallResult** | inoutoptional | 通常は NULL です。NULL でない場合、ppWorkingNamespace を NULL にする必要があります。この場合、このパラメーターは新しい IWbemCallResult オブジェクトへのポインターを受け取ります。lFlags パラメーターに WBEM_FLAG_RETURN_IMMEDIATELY が設定されている場合、この呼び出しはすぐに戻ります。その後、呼び出し元は、要求した名前空間のポインターが利用可能になるまで IWbemCallResult::GetResultServices メソッドを定期的にポーリングできます。エラーが発生して新しいオブジェクトが返されない場合、このパラメーターは NULL を指すように設定されます。 注意 このパラメーターを使用する場合、メソッドを呼び出す前に ppResult が NULL を指すように設定しておく必要があることに注意してください。これは 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 (ゼロ) になった時点で閉じられます。
IWbemServices::CancelAsyncCall メソッドは、非同期メソッドに元々渡された IWbemObjectSink ポインターに基づいて、現在保留中の非同期呼び出しをキャンセルします。
| pSink | IWbemObjectSink* | in | IWbemServices のいずれかの非同期メソッドに対してクライアントが提供した IWbemObjectSink 実装へのポインター。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。
失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。
ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。
解説(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 ;
}
IWbemServices::QueryObjectSink メソッドを使用すると、呼び出し元は Windows Management がエクスポートする通知ハンドラーを取得できます。
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | 予約されています。このパラメーターは 0 でなければなりません。 |
| ppResponseHandler | IWbemObjectSink** | out | 通知ハンドラーへのインターフェイスポインターを受け取ります。エラーが発生した場合は NULL を指すように設定されます。返されるポインターの参照カウントは 1 以上であり、呼び出し元は不要になった時点でこのポインターに対して IWbemServices::Release を呼び出す必要があります。利用可能な通知ハンドラーがない場合は NULL が返されることがありますが、これはエラーではありません。 注意 このメソッドに渡す ppResponseHandler パラメーターの値を NULL にすることはできません。
|
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。
ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。
IWbemServices::GetObject メソッドは、クラスまたはインスタンスを取得します。このメソッドは、現在の IWbemServices オブジェクトに関連付けられた名前空間からのみオブジェクトを取得します。
| strObjectPath | LPWSTR | in | 取得するオブジェクトのパス。NULL の場合、新しいクラスにすることができる空のオブジェクトが返されます。詳細については、 Creating a Class を参照してください。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | 次のフラグがこのメソッドの動作に影響します。 WBEM_FLAG_USE_AMENDED_QUALIFIERSこのフラグを設定すると、WMI は現在の接続のロケールに対応するローカライズ済み名前空間に格納されている amended 修飾子を取得します。設定しない場合は、直近の名前空間に格納されている修飾子のみが取得されます。 WBEM_FLAG_RETURN_WBEM_COMPLETEこのフラグを指定すると同期呼び出しになります。 WBEM_FLAG_RETURN_IMMEDIATELYこのフラグを指定すると半同期呼び出しになります。ppCallResult パラメーターに有効なポインターを渡す必要があります。詳細については、 Calling a Method を参照してください。 WBEM_FLAG_DIRECT_READこのフラグを指定すると、親クラスやサブクラスを考慮せずに、指定したクラスのプロバイダーに直接アクセスします。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、要求されたクラスまたはインスタンスを生成するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| ppObject | IWbemClassObject** | inoutoptional | NULL でない場合、オブジェクトが見つかればそのオブジェクトを受け取ります。返されるオブジェクトの参照カウントは 1 以上です。呼び出し元は、オブジェクトが不要になった時点で Release を呼び出す必要があります。エラーが発生した場合は、いずれの場合もこのパラメーターは NULL を指すように設定されます。 |
| ppCallResult | IWbemCallResult** | inoutoptional | NULL の場合、このパラメーターは使用されません。lFlags パラメーターに WBEM_FLAG_RETURN_IMMEDIATELY が含まれている場合、この呼び出しは WBEM_S_NO_ERROR を返してすぐに戻ります。ppCallResult パラメーターは新しい IWbemCallResult オブジェクトへのポインターを受け取り、 GetCallStatus メソッドでポーリングして結果を取得できます。呼び出し元は IWbemCallResult::GetResultObject を呼び出して、オブジェクトが利用可能になった時点で取得できます。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。
失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。
ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。
IWbemServices::GetObjectAsync メソッドは、パスに基づいてオブジェクト (クラス定義またはインスタンス) を取得します。
| strObjectPath | LPWSTR | in | 取得するオブジェクトのパス。インスタンスプロバイダーの場合、StrObjectPath は次の形式で指定できます。
NULL の場合は、新しいクラスにすることができる空のオブジェクトが返されます。詳細については、 Creating a Class を参照してください。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | 次のフラグがこのメソッドの動作に影響します。 WBEM_FLAG_USE_AMENDED_QUALIFIERSこのフラグを設定すると、WMI は現在の接続のロケールに対応するローカライズ済み名前空間に格納されている amended 修飾子を取得します。設定しない場合は、直近の名前空間に格納されている修飾子のみが取得されます。 WBEM_FLAG_DIRECT_READこのフラグを指定すると、親クラスやサブクラスを考慮せずに、指定したクラスのプロバイダーに直接アクセスします。 WBEM_FLAG_SEND_STATUSクライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、要求されたクラスまたはインスタンスを生成するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| pResponseHandler | IWbemObjectSink* | 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 が基底クラスのプロバイダーに要求します。
クラスプロバイダーを実装する場合、 GetObjectAsync は strObjectPath パラメーターに格納されたクラス名のオブジェクトパスを解析して、どのクラスが要求されているかを判別する必要があります。次に、 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;
}
IWbemServices::PutClass メソッドは、新しいクラスを作成するか、既存のクラスを更新します。pObject パラメーターで指定するクラスは、必要なすべてのプロパティ値が正しく初期化されている必要があります。
| pObject | IWbemClassObject* | in | 有効なクラス定義を指している必要があります。参照カウントは変更されません。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | 次のフラグがこのメソッドの動作に影響します。 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このフラグを指定すると、競合する子クラスが存在する場合でもクラスの更新を強制します。このフラグで強制される更新の例としては、あるクラス修飾子が子クラスで定義されており、基底クラスが既存の修飾子と競合する同じ修飾子を追加しようとする場合が挙げられます。強制モードでは、この競合は子クラス側の競合する修飾子を削除することで解決されます。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、クラスのインスタンスを生成する動的クラスプロバイダーが必要とする IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| ppCallResult | IWbemCallResult** | inoutoptional | NULL の場合、このパラメーターは使用されません。lFlags パラメーターに WBEM_FLAG_RETURN_IMMEDIATELY が含まれている場合、この呼び出しは WBEM_S_NO_ERROR を返してすぐに戻ります。ppCallResult パラメーターは新しい IWbemCallResult オブジェクトへのポインターを受け取り、 IWbemCallResult::GetCallStatus メソッドでポーリングして結果を取得できます。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。
失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。
ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。
IWbemServices::PutClassAsync メソッドは、新しいクラスを作成するか、既存のクラスを更新します。
| pObject | IWbemClassObject* | in | クラス定義を含むオブジェクトへのポインター。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | 次の値のうち 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このフラグを指定すると、競合する子クラスが存在する場合でもクラスの更新を強制します。このフラグで強制される更新の例としては、あるクラス修飾子が子クラスで定義されており、基底クラスが既存の修飾子と競合する同じ修飾子を追加しようとする場合が挙げられます。強制モードでは、この競合は子クラス側の競合する修飾子を削除することで解決されます。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、要求されたクラスを受け取るプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| pResponseHandler | IWbemObjectSink* | 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 固有のエラーコードが返されることもあります。
なお、 PutInstanceAsync が WBEM_S_NO_ERROR を返した場合、WMI は応答ハンドラーの SetStatus メソッドからの結果を待機します。WMI は、ローカル接続では無期限に、リモート接続ではタイムアウトが発生するまで待機します。
WBEM_E_FAILED を返すと他のプロバイダーがクラスを作成する機会を失うため、このコードは、後で成功する可能性のある形でクラスプロバイダーが失敗した場合にのみ返すようにしてください。
解説(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;
}
IWbemServices::DeleteClass メソッドは、指定したクラスを現在の名前空間から削除します。
| strClass | LPWSTR | in | 削除対象のクラスの名前。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | 次のいずれかの値を設定できます。 WBEM_FLAG_RETURN_IMMEDIATELYこのフラグを指定すると半同期呼び出しになります。詳細については、 Calling a Method を参照してください。 WBEM_FLAG_OWNER_UPDATE呼び出し元がプッシュプロバイダーであることを示します。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、クラスを削除するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| ppCallResult | IWbemCallResult** | inoutoptional | NULL の場合、このパラメーターは使用されません。ppCallResult を指定する場合は、呼び出し時に NULL を指すように設定しておく必要があります。lFlags パラメーターに WBEM_FLAG_RETURN_IMMEDIATELY が含まれている場合、この呼び出しは WBEM_S_NO_ERROR を返してすぐに戻ります。ppCallResult パラメーターは新しい IWbemCallResult オブジェクトへのポインターを受け取り、 GetCallStatus メソッドでポーリングして結果を取得できます。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。
失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。
ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。
IWbemServices::DeleteClassAsync メソッドは、指定したクラスを現在の名前空間から削除します。
| strClass | LPWSTR | in | 削除対象のクラスの名前。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | 次の値のうち 1 つ以上を指定できます。 WBEM_FLAG_SEND_STATUSこのフラグは、クライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を Windows Management に登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。 WBEM_FLAG_OWNER_UPDATEプッシュプロバイダーは、このクラスが変更されたことを示すために、 DeleteClassAsync を呼び出す際にこのフラグを指定する必要があります。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、クラスを削除するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| pResponseHandler | IWbemObjectSink* | 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)
動的インスタンスプロバイダーがそのクラスに関連付けられている場合、そのプロバイダーは登録解除され、以後そのクラスに対して呼び出されなくなります。削除されたクラスから派生するクラスもすべて削除され、それらに関連付けられたプロバイダーも登録解除されます。クラスが削除されると、指定したクラスとそのサブクラスの残存する静的インスタンスもすべて削除されます。
クラスが動的クラスプロバイダーによって提供されている場合、削除が成功するかどうかは、そのプロバイダーがクラスの削除をサポートしているかどうかに依存します。
メソッドを半同期で使用する方法の詳細については、IWbemServices::DeleteClass および Calling a Method を参照してください。
IWbemServices::CreateClassEnum メソッドは、選択条件を満たすすべてのクラスの列挙子を返します。
| strSuperclass | LPWSTR | in | NULL でも空でもない場合、親クラス名を指定します。このクラスのサブクラスであるクラスのみが列挙子に返されます。NULL または空で、かつ lFlags が WBEM_FLAG_SHALLOW の場合は、最上位のクラス (親クラスを持たないクラス) のみが返されます。NULL または空で、かつ lFlags が WBEM_FLAG_DEEP の場合は、名前空間内のすべてのクラスが返されます。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | 次のフラグがこのメソッドの動作に影響します。最良のパフォーマンスを得るには、このパラメーターに WBEM_FLAG_RETURN_IMMEDIATELY と WBEM_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このフラグを指定すると、前方参照専用の列挙子が返されます。前方参照専用の列挙子は通常、従来の列挙子より高速でメモリ使用量も少なくなりますが、 Clone や Reset を呼び出すことはできません。 WBEM_FLAG_BIDIRECTIONALこのフラグを指定すると、クライアントが列挙子を解放するまで、WMI は列挙対象オブジェクトへのポインターを保持します。オブジェクトのポインターがすぐには解放されないため、クライアントが大量のオブジェクトを列挙しようとすると、このメソッドは WBEM_E_OUT_OF_MEMORY という HRESULT で失敗する可能性があります。lFlags パラメーターに 0 (ゼロ) を設定した場合、既定でこのフラグが適用されます。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、要求されたクラスを提供するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| ppEnum | IEnumWbemClassObject** | out | 列挙子へのポインターを受け取ります。返されるオブジェクトの参照カウントは 1 以上です。呼び出し元は、不要になった時点でこのポインターに対して Release を呼び出す必要があります。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。
失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。
ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。
IWbemServices::CreateClassEnumAsync メソッドは、クラスプロバイダーがサポートするすべてのクラスの列挙を返します。
| strSuperclass | LPWSTR | in | NULL でも空でもない場合、このパラメーターは親クラス名を指定します。このクラスのサブクラスであるクラスのみが列挙子に返されます。NULL または空で、かつ lFlags が WBEM_FLAG_SHALLOW の場合は、最上位のクラス (親クラスを持たないクラス) のみが返されます。NULL または空で、かつ lFlags が WBEM_FLAG_DEEP の場合は、名前空間内のすべてのクラスが返されます。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | 次の値のうち 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 に登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。 注意 strSuperclass が NULL または空で、かつ WBEM_FLAG_DEEP が指定されている場合は、すべてのクラスが返されます。
|
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、要求されたクラスを返すプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| pResponseHandler | IWbemObjectSink* | 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 固有のエラーコードが返されることもあります。なお、 CreateClassEnumAsync が WBEM_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 のパフォーマンスにどのような影響を与えるかを確認するとよいでしょう。
IWbemServices::PutInstance メソッドは、既存クラスのインスタンスを作成または更新します。インスタンスは WMI リポジトリに書き込まれます。
| pInst | IWbemClassObject* | in | 書き込むインスタンスへのポインター。呼び出し元は、この呼び出しの完了時点における参照カウントについて仮定を置くことはできません。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | 次の値のうち 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 フレーバーを持つ修飾子を一切格納しません。このフラグを設定しない場合、このオブジェクトはローカライズされていないものとみなされ、すべての修飾子がこのインスタンスとともに格納されます。 |
| pCtx | IWbemContext* | in | 通常は NULL であり、この場合インスタンスのすべてのプロパティが更新されることを示します。それ以外の場合は、インスタンスに関する追加情報を含む IWbemContext オブジェクトへのポインターです。コンテキストオブジェクト内のデータは、そのインスタンスを担当するプロバイダーによって文書化されている必要があります。NULL でない IWbemContext オブジェクトは、部分インスタンス更新のサポートの有無を示すことができます。 完全インスタンス更新と部分インスタンス更新をサポートする方法の詳細については、 IWbemServices::PutInstanceAsync を参照してください。完全インスタンス更新または部分インスタンス更新の操作を要求する方法の詳細については、 Modifying an Instance Property を参照してください。 |
| ppCallResult | IWbemCallResult** | inoutoptional | NULL の場合、このパラメーターは使用されません。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 パラメーターに設定することはできません。たとえば、ClassA が ClassB と ClassC の基底クラスであるとします。ClassA はキーとして KeyProp プロパティを定義しており、ClassB には KeyProp が 1 に設定されたインスタンスがあります。KeyProp が 1 の ClassC のインスタンスを作成するには、アプリケーションはまず DeleteInstance を呼び出して ClassB のインスタンスを削除し、その後 PutInstance で ClassC のインスタンスを保存する必要があります。
pInst が指すインスタンスがサブクラスに属している場合、Windows Management は、そのサブクラスの派生元となるすべてのクラスを担当するプロバイダーを呼び出します。元の PutInstance 要求が成功するには、これらのプロバイダーがすべて成功する必要があります。階層の最上位クラスをサポートするプロバイダーが最初に呼び出されます。以降、最上位クラスのサブクラスへと呼び出しが続き、Windows Management が pInst の指すインスタンスを所有するクラスのプロバイダーに到達するまで、上から下へと進みます。
Windows Management は、インスタンスの子クラスのプロバイダーは呼び出しません。したがって、アプリケーションが継承されたプロパティの値を変更したい場合は、親クラスの対応するインスタンスではなく、子クラスの完全なインスタンスに対して PutInstance を呼び出す必要があります。
クラス階層に属するインスタンスを更新する場合、pInst パラメーターは、変更対象のプロパティを含むインスタンスを指している必要があります。たとえば、対象のインスタンスが ClassB に属しているとします。ClassB のインスタンスは ClassA から派生しており、ClassA はプロパティ PropA を定義しています。アプリケーションが ClassB のインスタンスにおける PropA の値を変更したい場合、pInst には ClassA のインスタンスではなく、その ClassB のインスタンスを設定する必要があります。
抽象クラスのインスタンスに対して PutInstance を呼び出すことは許可されていません。
IWbemServices::PutInstanceAsync メソッドは、既存クラスのインスタンスを非同期に作成または更新します。更新の確認またはエラー報告は、呼び出し元が実装する IWbemObjectSink インターフェイスを通じて提供されます。
| pInst | IWbemClassObject* | in | WMI リポジトリに書き込むインスタンスへのポインター。呼び出し元は、この呼び出しの完了時点における参照カウントについて仮定を置くことはできません。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | インスタンスが現在存在しない場合に、呼び出し元がインスタンスの作成を望むかどうかを指定します。 インスタンスプロバイダーを実装する際は、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 フレーバーを持つ修飾子を一切格納しません。このフラグを設定しない場合、このオブジェクトはローカライズされていないものとみなされ、すべての修飾子がこのインスタンスとともに格納されます。 |
| pCtx | IWbemContext* | in | クライアントが部分インスタンス更新と完全インスタンス更新のどちらを要求しているかを示すポインター。部分インスタンス更新はインスタンスのプロパティの一部のみを変更するのに対し、完全インスタンス更新はすべてのプロパティを変更します。NULL の場合、このパラメーターは呼び出し元のアプリケーションが完全インスタンス更新を要求していることを示します。それ以外の場合は、クラスのインスタンスを生成する動的クラスプロバイダーが必要とする IWbemContext オブジェクトへのポインターです。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| pResponseHandler | IWbemObjectSink* | in | 呼び出し元による IWbemObjectSink の実装へのポインター。このハンドラーは、この呼び出しの状態が利用可能になった時点で IWbemObjectSink::SetStatus メソッドを通じてそれを受け取ります。何らかのエラーコードが返された場合、渡された IWbemObjectSink ポインターは使用されません。WBEM_S_NO_ERROR が返された場合は、操作結果を通知するためにユーザーの IWbemObjectSink 実装が呼び出されます。Windows Management がポインターに対して AddRef を呼び出すのは、WBEM_S_NO_ERROR が返される場合だけです。エラーコードが返される場合、参照カウントは呼び出し前と同じです。非同期呼び出しを行う方法の詳細については、 Calling a Method を参照してください。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。
なお、 PutInstanceAsync が WBEM_S_NO_ERROR を返した場合、WMI は応答ハンドラーの SetStatus メソッドからの結果を待機します。WMI は、ローカル接続では無期限に、リモート接続ではタイムアウトが発生するまで待機します。
ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。
解説(Remarks)
PutInstanceAsync を呼び出すクライアントは、呼び出しの結果が自身の IWbemObjectSink::Indicate メソッドを通じて報告されることを常に想定しておく必要があります。
pInst が指すインスタンスが他のクラスから派生したクラスに属している場合、 PutInstanceAsync が成功するかどうかは、親クラスを担当するプロバイダーの成否に依存します。たとえば、pInst が ClassB に属し、ClassB が ClassA から派生している場合、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 | 更新対象のプロパティの一覧を格納します。インスタンスプロバイダーは、これ以外のプロパティをすべて無視する必要があります。 |
|
__PUT_EXT_ATOMIC
(VT_BOOL) |
すべての更新が成功する必要があり、そうでない場合、インスタンスプロバイダーは元に戻す必要があります。部分的な成功は許容されません。 |
インスタンスプロバイダーを実装する際は、pCtx 内の NULL プロパティに対して次のように対応してください。
- プロパティの型が VT_NULL の場合、プロバイダーはそのプロパティを変更せずに無視するか、操作を失敗させることができます。
- プロパティの型が VT_NULL でなく、そのプロパティを更新できない場合、プロバイダーは新しい値でプロパティを更新する義務があるため、エラーを返す必要があります。
非同期操作を実装する場合、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;
}
IWbemServices::DeleteInstance メソッドは、現在の名前空間内にある既存クラスのインスタンスを削除します。
| strObjectPath | LPWSTR | in | 削除対象のインスタンスのオブジェクトパスを含む有効な BSTR。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | 次のいずれかの値を指定できます。 WBEM_FLAG_RETURN_IMMEDIATELYこのフラグを指定すると半同期呼び出しになります。詳細については、 Calling a Method を参照してください。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、インスタンスを削除するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。 |
| ppCallResult | IWbemCallResult** | inoutoptional | NULL の場合、このパラメーターは使用されません。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 が次の階層の基底クラスであるとします。
- ClassA は ClassX から派生します。
- ClassB は ClassA から派生します。
- ClassC と ClassD は ClassB から派生します。
ClassX、ClassA、ClassB がすべて抽象クラスであり、 DeleteInstance の strObjectPath パラメーターが同じく ClassB のインスタンスを指している場合は、ClassC のプロバイダーまたは ClassD のプロバイダーのいずれかが成功する必要があります。
IWbemServices::DeleteInstanceAsync メソッドは、現在の名前空間内にある既存クラスのインスタンスを非同期に削除します。操作の完了確認または失敗は、呼び出し元が実装する IWbemObjectSink インターフェイスを通じて報告されます。
| strObjectPath | LPWSTR | in | 削除対象のオブジェクトの オブジェクトパスを含む有効な BSTR。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | WBEM_FLAG_SEND_STATUS は、クライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を Windows Management に登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。なお、ここでは WBEM_FLAG_USE_AMENDED_QUALIFIERS フラグは使用できません。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、インスタンスを削除するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。 |
| pResponseHandler | IWbemObjectSink* | in | 呼び出し元による IWbemObjectSink の実装へのポインター。このハンドラーは、削除操作の状態が利用可能になった時点で SetStatus メソッドを通じてそれを受け取ります。何らかのエラーコードが返された場合、渡された IWbemObjectSink ポインターは使用されません。WBEM_S_NO_ERROR が返された場合は、操作結果を通知するためにユーザーの IWbemObjectSink 実装が呼び出されます。Windows Management がポインターに対して AddRef を呼び出すのは、WBEM_S_NO_ERROR が返される場合だけです。エラーコードが返される場合、参照カウントは呼び出し前と同じです。詳細については、 Calling a Method を参照してください。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。
失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。
DeleteInstanceAsync が WBEM_S_NO_ERROR を返した場合、WMI は応答ハンドラーの SetStatus メソッドからの結果を待機します。WMI は、ローカル接続では無期限に、リモート接続ではタイムアウトが発生するまで待機します。
その他のエラー状態は、pResponseHandler パラメーターで指定したオブジェクトシンクに非同期に報告されます。
ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。
解説(Remarks)
インスタンスプロバイダーは、 DeleteInstanceAsync の戻りコード、または pResponseHandler を通じた SetStatus の呼び出しのいずれかで、成功または失敗を報告できます。 SetStatus に送信した場合、pResponseHandler を通じてシンクに送られた戻りコードが優先されます。コールバックが、クライアントが要求するのと同じ認証レベルで返されるとは限らないため、非同期通信ではなく半同期通信を使用することを推奨します。非同期通信が必要な場合は、Calling a Method を参照してください。
メソッドを半同期で使用する方法の詳細については、IWbemServices::DeleteInstance および Calling a Method を参照してください。
IWbemServices::CreateInstanceEnum メソッドは、ユーザーが指定した選択条件に従って、指定クラスのインスタンスを返す列挙子を作成します。
| strFilter | LPWSTR | in | インスタンスを取得したいクラスの名前を含む有効な BSTR。このパラメーターを NULL にすることはできません。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | 次のフラグがこのメソッドの動作に影響します。最良のパフォーマンスを得るには、このパラメーターに WBEM_FLAG_RETURN_IMMEDIATELY と WBEM_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このフラグを指定すると、前方参照専用の列挙子が返されます。前方参照専用の列挙子は一般に、従来の列挙子よりはるかに高速でメモリ使用量も少なくなりますが、 Clone や Reset を呼び出すことはできません。 WBEM_FLAG_BIDIRECTIONALこのフラグを指定すると、クライアントが列挙子を解放するまで、Windows Management は列挙対象オブジェクトへのポインターを保持します。オブジェクトのポインターがすぐには解放されないため、クライアントが大量のオブジェクトを列挙しようとすると、このメソッドは WBEM_E_OUT_OF_MEMORY の hResult で失敗する可能性があります。lFlags パラメーターに 0 (ゼロ) を設定した場合、既定でこのフラグが適用されます。 WBEM_FLAG_DIRECT_READこのフラグを指定すると、親クラスやサブクラスを考慮せずに、指定したクラスのプロバイダーに直接アクセスします。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、要求されたインスタンスを提供するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| ppEnum | IEnumWbemClassObject** | out | 列挙子へのポインターを受け取ります。参照カウントは 1 以上です。呼び出し元は、不要になった時点でこのポインターに対して IUnknown::Release を呼び出す必要があります。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。
失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。
ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。
解説(Remarks)
返された列挙子の要素数が 0 であっても、エラーではありません。
IWbemServices::CreateInstanceEnumAsync メソッドは、ユーザーが指定した選択条件に従って、指定クラスのインスタンスを非同期に返す列挙子を作成します。
| strFilter | LPWSTR | in | インスタンスを取得したいクラスの名前を含む有効な BSTR。このパラメーターを NULL にすることはできません。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | このパラメーターには次のいずれかの値を指定できます。 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このフラグを指定すると、親クラスやサブクラスを考慮せずに、指定したクラスのプロバイダーに直接アクセスします。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、要求されたインスタンスを返すプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。詳細については、 Making Calls to WMI を参照してください。 |
| pResponseHandler | IWbemObjectSink* | 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 を通じて送られた戻りコードが優先されます。
CreateInstanceEnumAsync が WBEM_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 のパフォーマンスにどのような影響を与えるかを確認するとよいでしょう。
IWbemServices::ExecQuery メソッドは、オブジェクトを取得するためのクエリを実行します。
| strQueryLanguage | LPWSTR | in | Windows Management がサポートするクエリ言語のいずれかを含む有効な BSTR。これは、WMI Query Language の略称である "WQL" でなければなりません。 |
| strQuery | LPWSTR | in | クエリのテキストを含む有効な BSTR。このパラメーターを NULL にすることはできません。WMI のクエリ文字列を組み立てる方法の詳細については、Querying with WQL および WQL リファレンスを参照してください。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | 次のフラグがこのメソッドの動作に影響します。最良のパフォーマンスを得るには、このパラメーターに WBEM_FLAG_RETURN_IMMEDIATELY と WBEM_FLAG_FORWARD_ONLY を指定することを推奨します。 WBEM_FLAG_USE_AMENDED_QUALIFIERSこのフラグを設定すると、WMI は現在の接続のロケールに対応するローカライズ済み名前空間に格納されている amended 修飾子を取得します。設定しない場合は、直近の名前空間に格納されている修飾子のみが取得されます。 WBEM_FLAG_FORWARD_ONLYこのフラグを指定すると、前方参照専用の列挙子が返されます。前方参照専用の列挙子は一般に、従来の列挙子よりはるかに高速でメモリ使用量も少なくなりますが、 Clone や Reset を呼び出すことはできません。 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このフラグを指定すると、親クラスやサブクラスを考慮せずに、指定したクラスのプロバイダーに直接アクセスします。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、要求されたクラスまたはインスタンスを提供するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| ppEnum | IEnumWbemClassObject** | 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 キーワードの上限は、クエリの複雑さによって変わります。
IWbemServices::ExecQueryAsync メソッドは、オブジェクトを非同期に取得するためのクエリを実行します。
| strQueryLanguage | LPWSTR | in | Windows Management Instrumentation (WMI) がサポートするクエリ言語のいずれかを含む有効な BSTR。これは "WQL" でなければなりません。 |
| strQuery | LPWSTR | in | クエリのテキストを含む有効な BSTR。これを NULL にすることはできません。インスタンスプロバイダーを実装する際、クエリが複雑すぎる場合はプロバイダーがそのクエリを拒否できます。プロバイダーがクエリを複雑すぎると判断した場合、WMI はより単純なクエリでプロバイダーを再試行するか、クエリ対象インスタンスの上位集合を取得して列挙することを選択できます。 WMI のクエリ文字列を組み立てる方法の詳細については、 Querying with WQL および WQL リファレンスを参照してください。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | このパラメーターには次のいずれかの値を指定できます。 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このフラグを指定すると、親クラスやサブクラスを考慮せずに、指定したクラスのプロバイダーに直接アクセスします。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、要求されたクラスまたはインスタンスを返すためにプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| pResponseHandler | IWbemObjectSink* | 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 を使用するには、__InstanceProviderRegistration の QuerySupportLevels プロパティを設定しないでください。そうすると、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 のパフォーマンスにどのような影響を与えるかを確認するとよいでしょう。
// The pSink variable is of type IWbemObjectSink*
pSink->SetStatus(WBEM_STATUS_REQUIREMENTS,
WBEM_REQUIREMENTS_START_POSTFILTER, 0, 0);
// The pSink variable is of type IWbemObjectSink*
pSink->SetStatus(WBEM_STATUS_REQUIREMENTS,
WBEM_REQUIREMENTS_STOP_POSTFILTER, 0, 0);
IWbemServices::ExecNotificationQuery メソッドは、イベントを受信するためのクエリを実行します。この呼び出しはすぐに戻り、ユーザーは返された列挙子をポーリングして、到着したイベントを取得できます。返された列挙子を解放すると、クエリはキャンセルされます。
| strQueryLanguage | LPWSTR | in | Windows Management がサポートするクエリ言語のいずれかを含む有効な BSTR。これを NULL にすることはできません。現在サポートされているのは WMI Query Language (WQL) のみです。 |
| strQuery | LPWSTR | in | イベント関連のクエリのテキストを含む有効な BSTR。これを NULL にすることはできません。WMI のクエリ文字列を組み立てる方法の詳細については、Querying with WQL および WQL リファレンスを参照してください。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | このパラメーターには WBEM_FLAG_RETURN_IMMEDIATELY と WBEM_FLAG_FORWARD_ONLY の両方を設定する必要があります。設定しない場合、呼び出しは失敗します。 WBEM_FLAG_FORWARD_ONLYこのフラグを指定すると、前方参照専用の列挙子が返されます。前方参照専用の列挙子は一般に、従来の列挙子よりはるかに高速でメモリ使用量も少なくなりますが、 Clone や Reset を呼び出すことはできません。 WBEM_FLAG_RETURN_IMMEDIATELYユーザーはこのフラグを指定する必要があります。指定しない場合、呼び出しは失敗します。これは、イベントが継続的に受信されるため、ユーザーが返された列挙子をポーリングする必要があるからです。発生するかどうか分からないイベントを待って、この呼び出しを無期限にブロックすると、スレッドが不定の時間ブロックされてしまいます。詳細については、 Calling a Method を参照してください。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、要求されたイベントを提供するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| ppEnum | IEnumWbemClassObject** | out | エラーが発生しなかった場合、このパラメーターは、呼び出し元がクエリの結果セットに含まれるインスタンスを取得するための列挙子を受け取ります。呼び出し元は、イベントが利用可能かどうかを確認するために、定期的に IEnumWbemClassObject::Next を呼び出します。この用法では、 Reset は列挙子をイベントシーケンスの先頭に戻さず、何の効果もない点に注意してください。このパラメーターは、返された列挙子に対して Release が呼び出されるまで、イベントを受信し続けることができます。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。
失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。
ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。
解説(Remarks)
WQL クエリで使用できる AND および OR キーワードの数には上限があります。複雑なクエリで多数の WQL キーワードを使用すると、WMI が HRESULT 値として WBEM_E_QUOTA_VIOLATION エラーコードを返すことがあります。WQL キーワードの上限は、クエリの複雑さによって変わります。
IWbemServices::ExecNotificationQueryAsync メソッドは IWbemServices::ExecNotificationQuery と同じ処理を行いますが、イベント通知を停止するために CancelAsyncCall が呼び出されるまで、指定した応答ハンドラーにイベントが供給される点が異なります。
| strQueryLanguage | LPWSTR | in | Windows Management がサポートするクエリ言語のいずれかを含む有効な BSTR。これは "WQL" でなければなりません。 |
| strQuery | LPWSTR | in | イベント関連のクエリのテキストを含む有効な BSTR。これを NULL にすることはできません。WMI のクエリ文字列を組み立てる方法の詳細については、Querying with WQL および WQL リファレンスを参照してください。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | このパラメーターには次の値を指定できます。 WBEM_FLAG_SEND_STATUSこのフラグは、クライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を Windows Management に登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、要求されたイベントを返すプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| pResponseHandler | IWbemObjectSink* | 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 キーワードの上限は、クエリの複雑さによって変わります。
CIM オブジェクトがエクスポートするメソッドを実行します。
| strObjectPath | LPWSTR | in | メソッドを実行する対象オブジェクトの オブジェクトパスを含む有効な BSTR。 |
| strMethodName | LPWSTR | in | オブジェクトのメソッドの名前。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | このパラメーターに 0 を設定すると同期呼び出しになります。半同期呼び出しにするには、lFlags に WBEM_FLAG_RETURN_IMMEDIATELY を設定し、ppCallResult パラメーターに有効なポインターを渡します。この場合、呼び出しはすぐに戻ります。詳細については、 Calling a Method を参照してください。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、メソッドを実行するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| pInParams | IWbemClassObject* | in | メソッドの実行に入力パラメーターが不要な場合は NULL でもかまいません。それ以外の場合は、メソッド実行時の入力パラメーターとして機能するプロパティを含む IWbemClassObject を指します。このオブジェクトの内容はメソッドごとに異なり、該当するプロバイダーの仕様の一部です。入力パラメーターの構築方法の詳細については、Creating Parameters Objects in C++ を参照してください。 |
| ppOutParams | IWbemClassObject** | inoutoptional | NULL でない場合、メソッド実行の出力パラメーターと戻り値へのポインターを受け取ります。このオブジェクトの内容はメソッドごとに異なり、該当するプロバイダーの仕様の一部です。呼び出し元は、返されたオブジェクトが不要になった時点で Release を呼び出す必要があります。 |
| ppCallResult | IWbemCallResult** | inoutoptional | NULL の場合、このパラメーターは使用されません。ppCallResult を指定する場合は、呼び出し時に NULL を指すように設定しておく必要があります。この場合、呼び出しは WBEM_S_NO_ERROR を返してすぐに戻ります。ppCallResult パラメーターは新しい IWbemCallResult オブジェクトへのポインターを受け取ります。メソッド実行の結果を取得するには、 GetCallStatus メソッドでこれをポーリングする必要があります。呼び出しの出力パラメーターは、 IWbemCallResult::GetResultObject を呼び出して取得できます。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下に、HRESULT に含まれる値を示します。
失敗した場合は、COM 関数 GetErrorInfo から利用可能な情報を取得できます。
ネットワークの問題により Windows Management へのリモート接続が失われた場合は、COM 固有のエラーコードが返されることもあります。
解説(Remarks)
ppOutParams が NULL でない場合、クライアントは ppOutParams が指すオブジェクトの ReturnValue プロパティを調べることで、メソッドの戻り値の型を判別できます。
CIM オブジェクトがエクスポートするメソッドを非同期に実行します。
| strObjectPath | LPWSTR | in | メソッドを実行する対象オブジェクトの オブジェクトパスを含む有効な BSTR。静的メソッドは、クラス名またはインスタンスへのオブジェクトパスのいずれかを使用して呼び出すことができます。メソッドプロバイダーは、オブジェクトパスのパラメーターを解析して、メソッド定義を含むクラスとインスタンスを判別できます。 |
| strMethodName | LPWSTR | in | オブジェクトのメソッドの名前。 |
| lFlags | WBEM_GENERIC_FLAG_TYPE | in | WBEM_FLAG_SEND_STATUS は、クライアントの IWbemObjectSink::SetStatus 実装を通じて中間状態レポートを受け取る要求を Windows Management に登録します。このフラグによって動作が変わるのは、プロバイダーの実装が中間状態レポートをサポートしている場合に限られます。なお、ここでは WBEM_FLAG_USE_AMENDED_QUALIFIERS フラグは使用できません。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、メソッドを実行するプロバイダーが使用できる IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、該当するプロバイダーのドキュメントで規定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| pInParams | IWbemClassObject* | in | メソッドの実行に入力パラメーターが不要な場合は NULL でもかまいません。それ以外の場合は、メソッド実行時の入力パラメーターとして機能するプロパティを含む IWbemClassObject オブジェクトを指します。このオブジェクトの内容はメソッドごとに異なり、該当するプロバイダーの仕様の一部です。ただし、最も一般的なオブジェクトは __Parameters システムクラスのインスタンスです。呼び出すメソッドの入力パラメーターごとに、非システムプロパティが 1 つ存在します。メソッドプロバイダーは、メソッド内の各パラメーターに付与された ID 修飾子を無視します。これらは通常、ブラウザーや類似のアプリケーションでのみ使用されます。 |
| pResponseHandler | IWbemObjectSink* | in | NULL にすることはできません。このオブジェクトシンクがメソッド呼び出しの結果を受け取ります。出力パラメーターは 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 公式リファレンス: 英語 (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 指定が可能。