IWbemHiPerfProvider
COM公式ドキュメント
プロバイダーがリフレッシュ可能なオブジェクトおよび列挙子を提供できるようにします。
メソッド 6
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
指定されたクラスのインスタンスを、渡された IWbemObjectSink インスタンスを使用して返します。
| pNamespace | IWbemServices* | in | プロバイダーからの任意の要求を処理できる、WMI へ戻るための IWbemServices ポインター。実行中に WMI へコールバックする必要がある場合、プロバイダーはこのポインターに対して AddRef を呼び出す必要があります。 |
| wszClass | LPWSTR | in | インスタンスを返す対象のクラスを指定する WCHAR 文字列へのポインター。 |
| lFlags | INT | in | フラグを格納する整数。 |
| pCtx | IWbemContext* | in | 通常は NULL です。それ以外の場合は、1 つ以上の動的クラスプロバイダーが必要とする IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、プロバイダーのドキュメントで指定されている必要があります。詳細については、 Making Calls to WMI を参照してください。 |
| pSink | IWbemObjectSink* | in | IWbemServices の非同期メソッドに対してクライアントが提供する IWbemObjectSink 実装へのポインター。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。次の一覧は、HRESULT に含まれる値を示します。
HiPerf プロバイダーは、 QueryInstances の戻り値、または pResponseHandler の SetStatus メソッドの呼び出しのいずれかによって、成功または失敗を報告できます。 SetStatus メソッドを呼び出した場合、pResponseHandler を通じて送られた戻りコードが QueryInstances の戻りコードより優先されます。
解説(Remarks)
WMI は、 IWbemServices::CreateInstanceEnum または IWbemServices::CreateInstanceEnumAsync の要求に応答して QueryInstances を呼び出します。
結果セットの終了を示すために IWbemObjectSink::SetStatus メソッドが呼び出されます。エラーが発生した場合は、 IWbemObjectSink::Indicate の呼び出しを挟まずに IWbemObjectSink::SetStatus が呼び出されることもあります。
例
次のコード例は、 QueryInstances の実装方法を示しています。
HRESULT CMyHiPerfProvider::QueryInstances(
/* [in] */ IWbemServices* pNamespace,
/* [in] */ BSTR strClass,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pSink
)
{
IWbemClassObject *pClass = 0;
IWbemClassObject *pNextInst = 0;
// IWbemObjectSink インターフェイスは、自分で定義した
// クラスに実装する必要があります。そのうえで、
// IWbemObjectSink インターフェイスを実装したクラスの
// インスタンスを pResponseHandler ポインターに
// 割り当てる必要があります。
IWbemObjectSink* pResponseHandler = 0;
HRESULT hRes;
// 名前空間ポインターを使用してクラス定義を
// 取得します。
hRes = pNamespace ->GetObject(strClass, 0, NULL, &pClass, 0);
if (WBEM_NO_ERROR==hRes)
return hRes;
// 続いてプライベートなソースをループし、各インスタンスを作成します。
for (int i = 0 ; i < NUM_OF_INSTANCES ; i++)
{
hRes = pClass->SpawnInstance(0, &pNextInst);
// 新しいインスタンスが生成されなければループを抜ける
if (WBEM_S_FALSE == hRes)
break;
if(NULL!=pNextInst)
{
// インスタンスを作成します。
// 例えば、pNextInst ポインターに値を割り当てる
// 関数 (FillInst) を呼び出します。
/*FillInst(pNextInst);*/
// クラスを WMI に引き渡します。
pResponseHandler->Indicate(1, &pNextInst);
pNextInst->Release();
pNextInst=NULL;
}
}
// 終了メッセージを WMI に送信します。
pResponseHandler->SetStatus(0, WBEM_S_NO_ERROR, 0, 0);
// メモリリソースを解放します。
pNamespace->Release();
pClass->Release();
SysFreeString(strClass);
return WBEM_S_NO_ERROR;
}
リフレッシャーを作成します。
| pNamespace | IWbemServices* | in | プロバイダーからの任意の要求を処理できる、Windows Management へ戻るための IWbemServices ポインター。実行中に Windows Management へコールバックする場合、プロバイダーはこのポインターに対して AddRef を呼び出す必要があります。 |
| lFlags | INT | in | 予約されています。このパラメーターは 0 (ゼロ) にする必要があります。 |
| ppRefresher | IWbemRefresher** | out | プロバイダーによる IWbemRefresher インターフェイスの実装への参照を受け取るポインター。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。次の一覧は、HRESULT に含まれる値を示します。
解説(Remarks)
プロバイダーは、 IWbemRefresher インターフェイスの実装を独自に提供する必要があります。WMI が複数のリフレッシャーを要求することは正当であり、それぞれが独自のリフレッシュ操作に使用されます。
リフレッシャーを解放する際、プロバイダーはそのリフレッシャーに追加されたリフレッシュ可能なオブジェクトや列挙子をすべてクリーンアップする必要があります。
例
次のコード例は、 CreateRefresher の実装方法を示しています。
HRESULT CHiPerfProvider::CreateRefresher(
/* [in] */IWbemServices *pNamespace,
/* [in] */ long lFlags,
/* [out] */ IWbemRefresher** ppRefresher
)
{
// 新しいリフレッシャーを割り当てます
// 例:
// CMyRefresher* pMyRefresher = new CMyRefresher();
// リフレッシャーを [out] パラメーターである
// ppRefresher に返します
/*return pMyRefresher->QueryInterface(
IID_IWbemRefresher, (void**) ppRefresher );*/
}
// メモリリソースを解放します。
// 例:
//pNamespace->Release();
//ppRefresher->Release();
//delete[] pMyRefresher;
リフレッシュ可能なインスタンスオブジェクトを要求します。
| pNamespace | IWbemServices* | in | プロバイダーからの任意の要求を処理できる、Windows Management へ戻るための IWbemServices ポインター。実行中に WMI へコールバックする必要がある場合、プロバイダーはこのポインターに対して AddRef を呼び出します。 |
| pTemplate | IWbemObjectAccess* | in | テンプレートを格納する IWbemObjectAccess オブジェクトへのポインター。 |
| pRefresher | IWbemRefresher* | in | IWbemHiPerfProvider::CreateRefresher の呼び出しによって取得したリフレッシャーを格納する IWbemRefresher オブジェクトへのポインター。 |
| lFlags | INT | in | 予約されています。このパラメーターは 0 にする必要があります。 |
| pContext | IWbemContext* | in | 通常は NULL です。それ以外の場合は、1 つ以上の動的クラスプロバイダーが必要とする IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、個々のプロバイダーのドキュメントで指定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| ppRefreshable | IWbemObjectAccess** | out | リフレッシュ可能なオブジェクトを格納する IWbemObjectAccess オブジェクトへの参照を受け取るポインター。 |
| plId | INT* | out | このリフレッシュ可能なオブジェクトを一意に識別する、プロバイダーが返す整数へのポインター。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。次の一覧は、HRESULT に含まれる値を示します。
解説(Remarks)
渡されるインスタンステンプレートには、キープロパティが設定されたオブジェクトが含まれます。返されるオブジェクトは、一意でリフレッシュ可能なオブジェクトである必要があります。プロバイダーは、リフレッシュ操作中を除いてそのリフレッシュ可能なオブジェクトに触れてはなりません。リフレッシャーを所有するオブジェクトがオブジェクトを復元する場合を除き、プロバイダーは返されたオブジェクトにアクセスしてはなりません。渡されるインスタンステンプレートのキープロパティは設定済みです。また、プロバイダーはインスタンスパスを検証する必要があります。
例
次のコード例は、 CreateRefreshableObject の実装方法を示しています。
HRESULT CMyHiPerfProvider::CreateRefreshableObject(
/* [in] */IWbemServices *pNamespace,
/* [in] */IWbemObjectAccess *pTemplate,
/* [in] */IWbemRefresher *pRefresher,
/* [in] */long lFlags,
/* [in] */IWbemContext *pCtx,
/* [out] */IWbemObjectAccess **ppRefreshable,
/* [out] */ long *plId
)
{
// リフレッシャーとやり取りするために定義した
// プライベートインターフェイスを使用します。IMyRefresher
// インターフェイスは自分で定義する必要があります。
IMyRefresher* pMyRefr = NULL;
HRESULT hres = pRefresher->QueryInterface(
IID_IMyRefresher,
(void**) &pMyRefr );
if ( SUCCEEDED( hres ) )
{
// 有効なインスタンスかどうかを確認します。
// ValidateInst 関数は自分で実装する必要があります。
if ( ValidateInst( pTemplate ) )
{
IWbemClassObject* pTemplateObj = NULL;
IWbemClassObject* pCloneObj = NULL;
IWbemObjectAccess* pCloneAcc = NULL;
// オブジェクトを複製し、IWbemObjectAccess
// ポインターを取得します。
pTemplate->QueryInterface(
IID_IWbemClassObject,
(void**) &pTemplateObj );
pTemplateObj->Clone( &pCloneObj );
pCloneObj->QueryInterface(
IID_IWbemObjectAccess,
(void**) &pCloneAcc );
// 一意の識別子を生成します。
// 例えば、次のようにします:
/**plId = InterlockedIncrement( &m_lLastId );*/
// リフレッシュ対象のオブジェクト配列に
// オブジェクトを追加します。
// 例えば、次のようにします:
/*pMyRefr->AddInstance( *plId, pCloneAcc );*/
// QI による AddRef を維持します
*ppRefreshable = pCloneAcc;
pTemplateObj->Release();
pCloneObj->Release();
}
else
{
hres = WBEM_E_NOT_FOUND;
}
pMyRefr->Release();
}
return hres;
}
指定された識別子に対応するオブジェクトまたは列挙子のリフレッシュを停止します。
| pRefresher | IWbemRefresher* | in | IWbemHiPerfProvider::CreateRefresher の呼び出しによって取得したリフレッシャーを格納する IWbemRefresher オブジェクトへのポインター。 |
| lId | INT | in | リフレッシュを停止するオブジェクトを一意に識別する、リフレッシャー識別子を格納する整数。 |
| lFlags | INT | in | フラグを格納する整数。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。次の一覧は、HRESULT に含まれる値を示します。
解説(Remarks)
リフレッシャーをクリーンアップするために StopRefreshing を呼び出す必要はありません。単純にリフレッシャーを削除する (つまり、そのすべての参照を解放する) だけで十分です。リフレッシャーを削除すると、その内部にあるすべてのオブジェクトと列挙子がクリーンアップされます。
新しいリフレッシュ可能な列挙を作成します。
| pNamespace | IWbemServices* | in | プロバイダーからの任意の要求を処理できる、Windows Management へ戻るための IWbemServices ポインター。実行中に pNamespace が Windows Management へコールバックする必要がある場合、プロバイダーはこのポインターに対して AddRef を呼び出します。 |
| wszClass | LPWSTR | in | pHiPerfEnum パラメーターでインスタンスがリフレッシュされるクラスの名前を格納する、16 ビット Unicode 文字による定数の null 終端文字列。 |
| pRefresher | IWbemRefresher* | in | IWbemHiPerfProvider::CreateRefresher の呼び出しによって取得したリフレッシャーを格納する IWbemRefresher オブジェクトへのポインター。 |
| lFlags | INT | in | 予約されています。このパラメーターは 0 (ゼロ) にする必要があります。 |
| pContext | IWbemContext* | in | 通常は NULL です。それ以外の場合は、1 つ以上の動的クラスプロバイダーが必要とする IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、個々のプロバイダーのドキュメントで指定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI を参照してください。 |
| pHiPerfEnum | IWbemHiPerfEnum* | in | 高パフォーマンス列挙を格納する IWbemHiPerfEnum オブジェクトへのポインター。 |
| plId | INT* | out | リフレッシュ可能な列挙を一意に識別する、プロバイダーが返す整数へのポインター。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。次の一覧は、HRESULT に含まれる値を示します。
解説(Remarks)
プロバイダーは、リフレッシュ操作中を除いてリフレッシュ可能な列挙子を変更してはなりません。この列挙は浅い (shallow) ものであるため、列挙子に格納するインスタンスはすべて wszClass で指定されたクラスのものである必要があります。
WMI が所有者の IWbemRefresher::Refresh メソッドを呼び出す場合を除き、プロバイダーは列挙子にアクセスしてはなりません。リフレッシュ可能なオブジェクトと同様に、列挙子を所有するオブジェクトが列挙子をリフレッシュする場合を除き、プロバイダーは列挙子を更新してはなりません。
例
次のコード例は、 CreateRefreshableEnum の実装方法を示しています。
HRESULT CHiPerfProvider::CreateRefreshableEnum(
/* [in] */IWbemServices *pNamespace,
/* [in] */LPCWSTR wszClass,
/* [in] */IWbemRefresher *pRefresher,
/* [in] */long lFlags,
/* [in] */IWbemContext *pCtx,
/* [in] */IWbemHiPerfEnum *pEnum,
/* [out] */ long *plId
)
{
// リフレッシャーとやり取りするために定義した
// プライベートインターフェイスを使用します。
IMyRefresher* pMyRefr = NULL;
HRESULT hres = pRefresher->QueryInterface(
IID_IMyRefresher,
(void**) &pMyRefr );
if ( SUCCEEDED( hres ) )
{
LPLONG plLastId;
// 一意の識別子を生成します
*plId = InterlockedIncrement( &plLastId );
// 内部メソッドを使用して、列挙子を配列に
// 追加します。
pMyRefr->AddEnum( wszClass, *plId, pEnum );
pMyRefr->Release();
}
return hres;
}
渡された配列内のオブジェクトの非キープロパティを挿入します。
| pNamespace | IWbemServices* | in | プロバイダーからの任意の要求を処理できる、Windows Management へ戻るための IWbemServices ポインター。実行中に Windows Management へコールバックする場合、プロバイダーはこのポインターに対して AddRef を呼び出す必要があります。 |
| lNumObjects | INT | in | 取得するオブジェクトの数を格納する整数。 |
| apObj | IWbemObjectAccess** | out | IWbemObjectAccess オブジェクトの配列へのポインター。GetObjects メソッドは、各オブジェクトのキープロパティをこの配列に挿入します。 |
| lFlags | INT | in | 予約されています。このパラメーターは 0 にする必要があります。 |
| pContext | IWbemContext* | in | 通常は NULL です。それ以外の場合は、1 つ以上の動的クラスプロバイダーが必要とする IWbemContext オブジェクトへのポインターです。コンテキストオブジェクトに設定する値は、個々のプロバイダーのドキュメントで指定されている必要があります。このパラメーターの詳細については、 Making Calls to WMI. を参照してください。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。次の一覧は、HRESULT に含まれる値を示します。
解説(Remarks)
要求されたオブジェクトには、キープロパティが設定されています。
例
次のコード例は、 GetObjects の実装方法を示しています。
HRESULT CMyHiPerfProvider::GetObjects(
/* [in] */IWbemServices *pNamespace,
/* [in] */ long lNumObjects,
/* [in,out] */IWbemObjectAccess **apObj,
/* [in] */long lFlags,
/* [in] */IWbemContext *pCtx
)
{
for ( long i = 0; i < lNumObjects; i++ )
{
// インスタンスを検証します (つまり、パスが
// 正しいことを確認します)。失敗した場合は
// エラーを返します。
// 例えば、IWbemObjectAccess インスタンスを検証し、
// 検証に失敗したら false を返すメソッドを
// 作成します。
/*if ( !ValidateInstance( apObj[i] ) )
return WBEM_E_NOT_FOUND;*/
// インスタンスに値を設定します。
// 例えば、IWbemObjectAccess インスタンスに値を
// 割り当てるメソッドを作成します。
/*FillInstance( apObj[i] );*/
}
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_IWbemHiPerfProvider "{49353C93-516B-11D1-AEA6-00C04FB68820}" #usecom global IWbemHiPerfProvider IID_IWbemHiPerfProvider "{}" #comfunc global IWbemHiPerfProvider_QueryInstances 3 sptr,wstr,int,sptr,sptr #comfunc global IWbemHiPerfProvider_CreateRefresher 4 sptr,int,sptr #comfunc global IWbemHiPerfProvider_CreateRefreshableObject 5 sptr,sptr,sptr,int,sptr,sptr,var #comfunc global IWbemHiPerfProvider_StopRefreshing 6 sptr,int,int #comfunc global IWbemHiPerfProvider_CreateRefreshableEnum 7 sptr,wstr,sptr,int,sptr,sptr,var #comfunc global IWbemHiPerfProvider_GetObjects 8 sptr,int,sptr,int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IWbemHiPerfProvider "{49353C93-516B-11D1-AEA6-00C04FB68820}" #usecom global IWbemHiPerfProvider IID_IWbemHiPerfProvider "{}" #comfunc global IWbemHiPerfProvider_QueryInstances 3 sptr,wstr,int,sptr,sptr #comfunc global IWbemHiPerfProvider_CreateRefresher 4 sptr,int,sptr #comfunc global IWbemHiPerfProvider_CreateRefreshableObject 5 sptr,sptr,sptr,int,sptr,sptr,sptr #comfunc global IWbemHiPerfProvider_StopRefreshing 6 sptr,int,int #comfunc global IWbemHiPerfProvider_CreateRefreshableEnum 7 sptr,wstr,sptr,int,sptr,sptr,sptr #comfunc global IWbemHiPerfProvider_GetObjects 8 sptr,int,sptr,int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。