IEnumCERTVIEWROW
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
証明書サービスのビューの行に含まれるデータを保持する行列挙シーケンスを表し、各行に関連付けられた列、属性、拡張へのさらなるアクセスを可能にします。
メソッド 8
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)
このメソッドが正常に完了すると、行内の証明書に関連付けられた列、属性、拡張を、次のインターフェースのメソッドを使用して列挙できます。
列挙シーケンス内のすべての行をループ処理することは、関係するクエリやシーケンスのサイズによっては、計算リソースを多く消費する場合があります。Examples
// pEnumRow は事前にインスタンス化された IEnumCERTVIEWROW へのポインターです。
LONG Index;
LONG nCount;
// 列挙子が先頭の行にあることを確認します。
if (FAILED(pEnumRow->Reset()))
printf("Failed to Reset\n");
else
{
nCount = 0;
// 行を列挙してデータベースレコードをカウントします。
while (S_OK == pEnumRow->Next(&Index))
nCount++;
// レコード数を表示します。
printf("Number of records is %d\n", nCount);
}
行列挙シーケンスの現在の行について、列列挙シーケンスのインスタンスを取得します。
| ppenum | IEnumCERTVIEWCOLUMN** | out | IEnumCERTVIEWCOLUMN 型のポインターへのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は列列挙シーケンスオブジェクトです。解説(Remarks)
この呼び出しで取得した列列挙シーケンスは、現在の行の証明書に関連付けられた列を列挙するために使用できます。この列挙には、IEnumCERTVIEWCOLUMN インターフェースのメソッドを通じてアクセスできます。
別の行を参照するには、次のいずれかのメソッドを呼び出して行列挙シーケンス内を移動します。
- IEnumCERTVIEWROW::Reset: 列挙シーケンスの先頭に移動します。
- IEnumCERTVIEWROW::Next: 列挙シーケンス内の次の行に移動します。
- IEnumCERTVIEWROW::Skip: 指定した数の行をスキップします。
Examples
// pEnumRow は事前にインスタンス化された IEnumCERTVIEWROW へのポインターです
HRESULT hr;
LONG Index;
IEnumCERTVIEWCOLUMN * pEnumCol = NULL;
// 列の列挙子を取得します
hr = pEnumRow->EnumCertViewColumn(&pEnumCol);
if ( FAILED( hr ))
{
printf("Failed EnumCertViewColumn - %x\n", hr );
goto error;
}
// 各列を列挙します
while (S_OK == pEnumCol->Next(&Index))
{
// 必要に応じてこの列を使用します。
}
error:
// リソースを解放します。
if ( NULL != pEnumCol )
pEnumCol->Release();
行列挙シーケンスの現在の行について、属性列挙シーケンスのインスタンスを取得します。
| Flags | INT | in |
| ||||
| ppenum | IEnumCERTVIEWATTRIBUTE** | out | IEnumCERTVIEWATTRIBUTE 型のポインターへのポインター。このメソッドが正常に完了すると、ppenum には IEnumCERTVIEWATTRIBUTE 型のポインターが設定されます。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は属性列挙シーケンスオブジェクトです。解説(Remarks)
この呼び出しで取得した属性列挙シーケンスは、現在の行の証明書に関連付けられた属性を列挙するために使用できます。この列挙には、IEnumCERTVIEWATTRIBUTE インターフェースのメソッドを通じてアクセスできます。
別の行を参照するには、次のいずれかのメソッドを呼び出して行列挙シーケンス内を移動します。
- IEnumCERTVIEWROW::Reset: 列挙シーケンスの先頭に移動します。
- IEnumCERTVIEWROW::Next: 列挙シーケンス内の次の行に移動します。
- IEnumCERTVIEWROW::Skip: 指定した数の行をスキップします。
Examples
// pEnumRow は事前にインスタンス化された IEnumCERTVIEWROW へのポインターです
HRESULT hr;
LONG Index;
IEnumCERTVIEWATTRIBUTE * pEnumAttr = NULL;
// 属性の列挙子を取得します
hr = pEnumRow->EnumCertViewAttribute(0, &pEnumAttr);
if (FAILED(hr))
{
printf("Failed EnumCertViewAttribute - %x\n", hr);
goto error;
}
// 各属性を列挙します
while (S_OK == pEnumAttr->Next(&Index))
{
// 必要に応じてこの属性を使用します。
}
error:
// リソースを解放します。
if (NULL != pEnumAttr)
pEnumAttr->Release();
行列挙シーケンスの現在の行について、拡張列挙シーケンスのインスタンスを取得します。
| Flags | INT | in |
| ||||
| ppenum | IEnumCERTVIEWEXTENSION** | out | IEnumCERTVIEWEXTENSION 型のポインターへのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は拡張列挙シーケンスオブジェクトです。解説(Remarks)
この呼び出しで取得した拡張列挙シーケンスは、現在の行の証明書に関連付けられた拡張を列挙するために使用できます。この列挙には、IEnumCERTVIEWEXTENSION インターフェースのメソッドを通じてアクセスできます。
別の行を参照するには、次のいずれかのメソッドを呼び出して行列挙シーケンス内を移動します。
- IEnumCERTVIEWROW::Reset: 列挙シーケンスの先頭に移動します。
- IEnumCERTVIEWROW::Next: 列挙シーケンス内の次の行に移動します。
- IEnumCERTVIEWROW::Skip: 指定した数の行をスキップします。
Examples
// pEnumRow は事前にインスタンス化された IEnumCERTVIEWROW へのポインターです。
LONG Index;
HRESULT hr;
IEnumCERTVIEWEXTENSION * pEnumExt = NULL;
// 拡張の列挙子を取得します。
hr = pEnumRow->EnumCertViewExtension(0, &pEnumExt);
if (FAILED(hr))
{
printf("Failed EnumCertViewExtension - %x\n", hr);
goto error;
}
// 各拡張を列挙します。
while (S_OK == pEnumExt->Next(&Index))
{
// 必要に応じてこの拡張を使用します。
}
error:
// リソースを解放します。
if (NULL != pEnumExt)
pEnumExt->Release();
行列挙シーケンス内で指定した数の行をスキップします。
| celt | INT | in | スキップする行数。celt パラメーターに正の値を指定すると、行列挙シーケンスは列挙シーケンス内を前方にスキップします。celt パラメーターに負の値を指定すると、行列挙シーケンスは列挙シーケンス内を後方にスキップします。 |
戻り値
VB
メソッドが成功した場合、S_OK を返します。戻り値が E_INVALIDARG の場合、celt パラメーターに負の値が指定され、その結果、行列挙シーケンスのインデックスがゼロ未満になったことを示します。
メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
このメソッドが正常に完了したら、IEnumCERTVIEWROW::Skip メソッドを呼び出して、行列挙シーケンス内の現在の行を参照します。この2回目の呼び出しを行った後、行内の証明書に関連付けられた列、属性、拡張を、次のインターフェースのメソッドを使用して列挙できます。
行列挙シーケンスは、内部にゼロベースのインデックスを保持します。Skip メソッドの呼び出しにより、このインデックスは celt パラメーターの設定に応じて増減します。celt パラメーターの負の値によってインデックスがゼロ未満になった場合、その後の Next の呼び出しの動作は未定義です。
celt パラメーターの正の値によってインデックスが列挙シーケンスの最後の行を超えた場合、その後の Next メソッドの呼び出しは失敗します。
Examples
// pEnumRow は事前にインスタンス化された IEnumCERTVIEWROW へのポインターです。
HRESULT hr;
LONG Index;
// 行列挙子を行の先頭に再配置します。
hr = pEnumRow->Reset();
if (FAILED(hr))
{
printf("Unable to reset pEnumRow\n");
goto error;
}
// いくつかの行をスキップします。
hr = pEnumRow->Skip(5);
if (FAILED(hr))
{
printf("Unable to skip rows\n");
goto error;
}
// 次の行を取得します。
hr = pEnumRow->Next(&Index);
if (S_OK == hr)
{
// 必要に応じてこの行を使用します。
}
error:
if (NULL != pEnumRow)
pEnumRow->Release();
行列挙シーケンスの先頭に移動します。
戻り値
VB
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
このメソッドが正常に完了したら、IEnumCERTVIEWROW::Next メソッドを呼び出して、列挙内の最初の行を参照します。
この2回目の呼び出しを行った後、行内の証明書に関連付けられた列、属性、拡張を、次のインターフェースのメソッドを使用して列挙できます。
Examples
// pEnumRow は事前にインスタンス化された IEnumCERTVIEWROW へのポインターです。
HRESULT hr;
LONG Index;
// 列挙子が先頭の行にあることを確認します。
hr = pEnumRow->Reset();
if (FAILED(hr))
printf("Failed to Reset\n");
else
{
printf("Reset to beginning\n");
// 最初のレコードを取得します。
hr = pEnumRow->Next(&Index);
// hr が成功かどうかを確認し、行を処理します。
// ...
}
| ppenum | IEnumCERTVIEWROW** | out | 現在の列挙状態を複製した新しい列挙子(IEnumCERTVIEWROW)を受け取るポインタである。 |
行列挙シーケンス内のすべての行が参照された後の、有効な最大インデックス値を取得します。
| pIndex | INT* | inout | 行列挙シーケンスの最大インデックス値を格納する LONG 変数へのポインター。pIndex が NULL の場合、このメソッドは失敗します。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、pIndex には行列挙シーケンスの最大インデックス値が設定されます。最後の行までの走査が行われていない場合、このメソッドは E_UNEXPECTED を返して失敗します。
メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は行列挙シーケンスの最大インデックス値です。最後の行までの走査が行われていない場合、このメソッドは失敗します。解説(Remarks)
このメソッドが正常に完了するかどうかは、列挙シーケンスの最後の行に到達しているかどうかに依存します。最大行インデックスは、スクロールバーや表示ウィンドウのサイズ設定に役立ちますが、クエリ全体を評価する必要があるため、計算リソースを多く消費する場合もあります。一部のクエリでは、各行がビューに含まれるかどうかを判断するために、各行の列データを調べる必要があります。ユーザーがすべてのデータをページ送りし終えるか、明示的に末尾まで進むよう要求した後は、最大行インデックスが保持されます。
行列挙シーケンス内を移動するには、次のメソッドを呼び出します。
| メソッド | 説明 |
|---|---|
| IEnumCERTVIEWROW::Reset | 列挙シーケンスの先頭に移動します。 |
| IEnumCERTVIEWROW::Next | 列挙シーケンス内の次の行に移動します。 |
| IEnumCERTVIEWROW::Skip | 指定した数の行をスキップします。 |
Examples
#include <windows.h>
#include <stdio.h>
#include <Certview.h>
long nMax;
// 最大行インデックスを判定します。
hr = pRow->GetMaxIndex(&nMax);
if (FAILED(hr))
printf("Failed GetMaxIndex [%x]\n", hr);
else
printf("Max index is: %d\n", nMax);
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IEnumCERTVIEWROW "{D1157F4C-5AF2-11D1-9BDC-00C04FB683FA}" #usecom global IEnumCERTVIEWROW IID_IEnumCERTVIEWROW "{}" #comfunc global IEnumCERTVIEWROW_Next 7 var #comfunc global IEnumCERTVIEWROW_EnumCertViewColumn 8 sptr #comfunc global IEnumCERTVIEWROW_EnumCertViewAttribute 9 int,sptr #comfunc global IEnumCERTVIEWROW_EnumCertViewExtension 10 int,sptr #comfunc global IEnumCERTVIEWROW_Skip 11 int #comfunc global IEnumCERTVIEWROW_Reset 12 #comfunc global IEnumCERTVIEWROW_Clone 13 sptr #comfunc global IEnumCERTVIEWROW_GetMaxIndex 14 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。#define global IID_IEnumCERTVIEWROW "{D1157F4C-5AF2-11D1-9BDC-00C04FB683FA}" #usecom global IEnumCERTVIEWROW IID_IEnumCERTVIEWROW "{}" #comfunc global IEnumCERTVIEWROW_Next 7 sptr #comfunc global IEnumCERTVIEWROW_EnumCertViewColumn 8 sptr #comfunc global IEnumCERTVIEWROW_EnumCertViewAttribute 9 int,sptr #comfunc global IEnumCERTVIEWROW_EnumCertViewExtension 10 int,sptr #comfunc global IEnumCERTVIEWROW_Skip 11 int #comfunc global IEnumCERTVIEWROW_Reset 12 #comfunc global IEnumCERTVIEWROW_Clone 13 sptr #comfunc global IEnumCERTVIEWROW_GetMaxIndex 14 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。