IEnumCERTVIEWATTRIBUTE
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
行列挙シーケンスの現在の行に対応する証明書属性を格納する、属性列挙シーケンスを表します。
メソッド 6
vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。
属性列挙シーケンス内の次の属性へ移動します。
| pIndex | INT* | inout | 参照される次の属性のインデックス値を格納する変数へのポインター。列挙する属性がこれ以上ない場合、この変数には –1 が設定されます。pIndex が NULL の場合、このメソッドは失敗します。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、属性列挙シーケンスは次の属性を参照している状態になります。属性がこれ以上ない場合、メソッドは S_FALSE を返し、pIndex には –1 の値が設定されます。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、属性列挙シーケンスが現在参照している属性のインデックス値です。列挙する属性がこれ以上ない場合、戻り値は –1 です。解説(Remarks)
このメソッドが正常に完了すると、属性の名前と値には 次のメソッドを通じてアクセスできます:
例
LONG Index;
HRESULT hr;
BSTR bstrAttribName = NULL;
// pEnumAttr は事前にインスタンス化された IEnumCERTVIEWATTRIBUTE オブジェクト
while (S_OK == pEnumAttr->Next(&Index))
{
// 属性名を取得する
hr = pEnumAttr->GetName(&bstrAttribName);
if (FAILED(hr))
printf("Failed GetName - %x\n", hr );
else
printf("Attribute name: %ws\n", bstrAttribName);
}
// リソースを解放する
if (NULL != bstrAttribName)
SysFreeString(bstrAttribName);
属性列挙シーケンス内の現在の属性の名前を取得します。
| pstrOut | LPWSTR* | inout | 属性の名前を格納する BSTR 型の変数へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、pstrOut パラメーターに属性の名前が格納されます。このメソッドを使用するには、BSTR 型の変数を作成し、その変数に NULL を設定して、この変数のアドレスを pstrOut として渡します。BSTR の使用が終わったら、SysFreeString 関数を呼び出して解放してください。
メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、属性の名前を格納する String です。解説(Remarks)
このメソッドは、属性列挙シーケンスが現在参照している 属性の名前を取得するために使用します。
属性列挙シーケンスが有効な属性を参照していない場合、GetName は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください:
- IEnumCERTVIEWATTRIBUTE::Reset: 列挙シーケンスの先頭へ移動します。
- IEnumCERTVIEWATTRIBUTE::Next: 列挙シーケンス内の次の属性へ移動します。
- IEnumCERTVIEWATTRIBUTE::Skip: 指定した数の属性をスキップします。
例
BSTR bstrAttribName = NULL;
// pEnumAttr は事前にインスタンス化された IEnumCERTVIEWATTRIBUTE オブジェクト
hr = pEnumAttr->GetName(&bstrAttribName);
if (S_OK != hr)
printf("Failed call to GetName - %x\n", hr);
else
printf("Attribute name is %ws\n", bstrAttribName );
// 完了したらメモリを解放する
if (NULL != bstrAttribName)
SysFreeString(bstrAttribName);
属性列挙シーケンス内の現在の属性の値を取得します。
| pstrOut | LPWSTR* | inout | 属性の値を格納する BSTR 型へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、pstrOut に現在の属性の値が設定されます。このメソッドを使用するには、BSTR 型の変数を作成し、その変数に NULL を設定して、この変数のアドレスを pstrOut として渡します。BSTR の使用が終わったら、SysFreeString 関数を呼び出して解放してください。
メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、現在の属性の値を表す String です。解説(Remarks)
このメソッドは、属性列挙シーケンスが現在参照している 属性のデータを取得するために使用します。
属性列挙シーケンスが有効な属性を参照していない場合、GetValue は失敗します。列挙内を移動するには、 次のいずれかのメソッドを使用してください:
- IEnumCERTVIEWATTRIBUTE::Reset: 列挙シーケンスの先頭へ移動します。
- IEnumCERTVIEWATTRIBUTE::Next: 列挙シーケンス内の次の属性へ移動します。
- IEnumCERTVIEWATTRIBUTE::Skip: 指定した数の属性をスキップします。
例
BSTR bstrAttribValue = NULL;
// pEnumAttr は事前にインスタンス化された IEnumCERTVIEWATTRIBUTE オブジェクト
hr = pEnumAttr->GetValue(&bstrAttribValue);
if (S_OK != hr)
printf("Failed call to GetValue - %x\n", hr);
else
printf("Attribute value is %ws\n",bstrAttribValue);
// 完了したらメモリを解放する
if (NULL != bstrAttribValue)
SysFreeString(bstrAttribValue);
属性列挙シーケンス内で指定した数の属性をスキップします。
| celt | INT | in | スキップする属性の数。celt パラメーターに正の値を指定すると、属性列挙シーケンスはシーケンス内を前方へスキップします。celt パラメーターに負の値を指定すると、属性列挙シーケンスはシーケンス内を後方へスキップします。 |
戻り値
VB
メソッドが成功した場合、S_OK を返します。戻り値が E_INVALIDARG の場合、celt パラメーターの負の値によって属性列挙シーケンスのインデックスがゼロ未満になったことを示します。
メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
このメソッドが正常に完了したら、 IEnumCERTVIEWATTRIBUTE::Next メソッドを呼び出して、属性列挙シーケンス内の現在の属性を参照します。属性の名前と値には、次のメソッドを通じてアクセスできます:
属性列挙シーケンスは、ゼロから始まる内部インデックスを保持します。Skip メソッドを呼び出すと、このインデックスは celt パラメーターで指定された属性の数だけ増加または減少します。celt パラメーターの負の値によってインデックスがゼロ未満になった場合、以降の IEnumCERTVIEWATTRIBUTE::Next の呼び出しの動作は未定義となります。
celt パラメーターの正の値によってインデックスが列挙シーケンスの最後の属性を超えた場合、以降の IEnumCERTVIEWATTRIBUTE::Next メソッドの呼び出しは失敗します。
例
HRESULT hr;
LONG Index;
// pEnumAttr は事前にインスタンス化された IEnumCERTVIEWATTRIBUTE オブジェクト
// 次の 5 個の属性をスキップする
hr = pEnumAttr->Skip(5);
if (S_OK == hr)
{
// 次の属性を取得する
hr = pEnumAttr->Next(&Index);
if (S_OK == hr)
{
// 必要に応じてこの属性を使用する。
}
}
属性列挙シーケンスの先頭へ移動します。
戻り値
VB
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
このメソッドが正常に完了したら、 IEnumCERTVIEWATTRIBUTE::Next メソッドを呼び出して、属性列挙シーケンス内の最初の属性を参照します。属性の名前と値には、次のメソッドを使用してアクセスできます:
例
// pEnumAttr は事前にインスタンス化された
// IEnumCERTVIEWATTRIBUTE オブジェクト。
HRESULT hr;
LONG Index;
hr = pEnumAttr->Reset();
if (S_OK != hr)
printf("Unable to reset pEnumAttr - %x\n", hr );
// 適切なエラーハンドラーを呼び出して終了処理を行う。
else
{
// 再び属性の先頭にリセットする。
while (S_OK == pEnumAttr->Next(&Index))
{
// 必要に応じて各属性を使用する。
}
}
属性列挙シーケンスオブジェクトのコピーを、その現在の状態で作成します。
| ppenum | IEnumCERTVIEWATTRIBUTE** | out | IEnumCERTVIEWATTRIBUTE 型のポインターへのポインター。ppenum が NULL の場合、この関数は失敗します。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、複製された属性列挙シーケンスオブジェクトです。解説(Remarks)
属性列挙シーケンスオブジェクトは、 IEnumCERTVIEWROW::EnumCertViewAttribute メソッドの呼び出しによって取得されます。
例
// pEnumAttr は事前にインスタンス化された IEnumCERTVIEWATTRIBUTE オブジェクト
IEnumCERTVIEWATTRIBUTE * pEnumAttr2 = NULL;
HRESULT hr;
hr = pEnumAttr->Clone(&pEnumAttr2);
if (S_OK != hr)
printf("Unable to clone IEnumCERTVIEWATTRIBUTE\n");
else
{
// 必要に応じて複製したオブジェクトを使用する
// ...
}
// 複製したオブジェクトの使用が終わったら、メモリを解放する
if (NULL != pEnumAttr2)
pEnumAttr2->Release();
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IEnumCERTVIEWATTRIBUTE "{E77DB656-7653-11D1-9BDE-00C04FB683FA}" #usecom global IEnumCERTVIEWATTRIBUTE IID_IEnumCERTVIEWATTRIBUTE "{}" #comfunc global IEnumCERTVIEWATTRIBUTE_Next 7 var #comfunc global IEnumCERTVIEWATTRIBUTE_GetName 8 var #comfunc global IEnumCERTVIEWATTRIBUTE_GetValue 9 var #comfunc global IEnumCERTVIEWATTRIBUTE_Skip 10 int #comfunc global IEnumCERTVIEWATTRIBUTE_Reset 11 #comfunc global IEnumCERTVIEWATTRIBUTE_Clone 12 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。#define global IID_IEnumCERTVIEWATTRIBUTE "{E77DB656-7653-11D1-9BDE-00C04FB683FA}" #usecom global IEnumCERTVIEWATTRIBUTE IID_IEnumCERTVIEWATTRIBUTE "{}" #comfunc global IEnumCERTVIEWATTRIBUTE_Next 7 sptr #comfunc global IEnumCERTVIEWATTRIBUTE_GetName 8 sptr #comfunc global IEnumCERTVIEWATTRIBUTE_GetValue 9 sptr #comfunc global IEnumCERTVIEWATTRIBUTE_Skip 10 int #comfunc global IEnumCERTVIEWATTRIBUTE_Reset 11 #comfunc global IEnumCERTVIEWATTRIBUTE_Clone 12 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。