IEnumCERTVIEWCOLUMN
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
列挙シーケンスの現在の行の列データを含む、列の列挙シーケンスを表します。
メソッド 10
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)
このメソッドが正常に完了すると、次のいずれかのメソッドを呼び出すことで列内の情報を取得できます。
- IEnumCERTVIEWCOLUMN::GetName: 列のローカライズされていない名前を取得します。
- IEnumCERTVIEWCOLUMN::GetDisplayName: 列のローカライズされた名前を取得します。
- IEnumCERTVIEWCOLUMN::GetValue: 列内のデータを取得します。
- IEnumCERTVIEWCOLUMN::GetType: 列内のデータの型を取得します。
- IEnumCERTVIEWCOLUMN::GetMaxLength: 列の最大長(バイト単位)を取得します。
例
LONG nLength;
LONG nType;
LONG bIsindexed;
LONG Index;
HRESULT hr;
BSTR bstrColName = NULL;
// pEnumCol は事前にインスタンス化された IEnumCERTVIEWCOLUMN オブジェクト
// 各列を調べる
while (S_OK == pEnumCol->Next(&Index))
{
// データベース長を判定する
hr = pEnumCol->GetMaxLength(&nLength);
if (FAILED(hr))
{
printf("Failed GetMaxLength %x\n", hr);
goto error;
}
// データ型を判定する
hr = pEnumCol->GetType(&nType);
if (FAILED(hr))
{
printf("Failed GetType %x\n", hr);
goto error;
}
// 列がインデックス付けされているか判定する
hr = pEnumCol->IsIndexed(&bIsindexed);
if (FAILED(hr))
{
printf("Failed IsIndexed %x\n", hr);
goto error;
}
// 列名を取得する
hr = pEnumCol->GetName(&bstrColName);
if (FAILED(hr))
{
printf("Failed GetName %x\n", hr);
goto error;
}
// この列の情報を 1 行で出力する
// 名前と長さを出力する
printf("Column %ws has max length %d",
bstrColName,
nLength);
// データ型を出力する
switch (nType)
{
case PROPTYPE_BINARY:
printf(" Type is Binary");
break;
case PROPTYPE_DATE:
printf(" Type is Date+Time");
break;
case PROPTYPE_LONG:
printf(" Type is Signed long");
break;
case PROPTYPE_STRING:
printf(" Type is Unicode String");
break;
default:
printf(" Type is unknown");
break;
}
// インデックス状態を出力する
printf(bIsindexed ? " Indexed" : " Not indexed");
// 改行を出力する
printf("\n");
}
error:
// 処理完了、リソースを解放する
if (NULL != bstrColName)
SysFreeString(bstrColName);
列の列挙シーケンス内の現在の列のローカライズされていない名前を取得します。
| pstrOut | LPWSTR* | inout | 列の名前を格納する BSTR 型の変数へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、pstrOut パラメーターに列の名前が格納されます。このメソッドを使用するには、BSTR 型の変数を作成し、その変数に NULL を設定して、この変数のアドレスを pstrOut として渡します。BSTR の使用を終えたら、SysFreeString 関数を呼び出して解放してください。
メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、列の名前を含む String です。解説(Remarks)
このメソッドは、列の列挙シーケンスが現在参照している列のローカライズされていない名前を取得するために使用します。
列の列挙シーケンスが有効な列を参照していない場合、GetName は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください。
- IEnumCERTVIEWCOLUMN::Reset: 列挙シーケンスの先頭に移動します。
- IEnumCERTVIEWCOLUMN::Next: 列挙シーケンス内の次の列に移動します。
- IEnumCERTVIEWCOLUMN::Skip: 指定した数の列をスキップします。
例
BSTR bstrColName = NULL;
HRESULT hr;
// pEnumCol は事前にインスタンス化された IEnumCERTVIEWCOLUMN オブジェクト
hr = pEnumCol->GetName(&bstrColName);
if (S_OK == hr)
printf("Column name is %ws\n", bstrColName);
// 処理完了、リソースを解放する
if (NULL != bstrColName)
SysFreeString(bstrColName);
列の列挙シーケンス内の現在の列のローカライズされた名前を取得します。
| pstrOut | LPWSTR* | inout | 列のローカライズされた名前を格納する BSTR 型の変数へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、pstrOut パラメーターに列のローカライズされた名前が格納されます。このメソッドを使用するには、BSTR 型の変数を作成し、その変数に NULL を設定して、この変数のアドレスを pstrOut として渡します。BSTR の使用を終えたら、SysFreeString 関数を呼び出して解放してください。
メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、列のローカライズされた名前を含む String です。解説(Remarks)
このメソッドは、列の列挙シーケンスが現在参照している列のローカライズされた名前を取得するために使用します。
列の列挙シーケンスが有効な列を参照していない場合、GetDisplayName は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください。
- IEnumCERTVIEWCOLUMN::Reset: 列挙シーケンスの先頭に移動します。
- IEnumCERTVIEWCOLUMN::Next: 列挙シーケンス内の次の列に移動します。
- IEnumCERTVIEWCOLUMN::Skip: 指定した数の列をスキップします。
例
BSTR bstrDisplay = NULL;
HRESULT hr;
// pEnumCol は事前にインスタンス化された IEnumCERTVIEWCOLUMN オブジェクト
hr = pEnumCol->GetDisplayName(&bstrDisplay);
if (S_OK == hr)
printf("Column name is %ws\n", bstrDisplay);
// 処理完了、リソースを解放する。
if (NULL != bstrDisplay)
SysFreeString(bstrDisplay);
列の列挙シーケンス内の現在の列のデータ型を取得します。
| pType | INT* | inout | 列の列挙シーケンスが参照する列のデータ型を示す LONG 型の変数へのポインター。有効なデータ型の表については、「解説」を参照してください。pType パラメーターが NULL に設定されている場合、このメソッドは失敗します。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は列のデータ型を表します。有効なデータ型の表については、「解説」を参照してください。解説(Remarks)
このメソッドは、列の列挙シーケンスが現在参照している列のデータ型を判定するために使用します。有効なデータ型を次の表に示します。
| データ型 | 意味 |
|---|---|
| PROPTYPE_BINARY | バイナリデータ |
| PROPTYPE_DATE | 日付/時刻 |
| PROPTYPE_LONG | 符号付き long |
| PROPTYPE_STRING | Unicode 文字列 |
列の列挙シーケンスが有効な列を参照していない場合、GetType は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください。
- IEnumCERTVIEWCOLUMN::Reset: 列挙シーケンスの先頭に移動します。
- IEnumCERTVIEWCOLUMN::Next: 列挙シーケンス内の次の列に移動します。
- IEnumCERTVIEWCOLUMN::Skip: 指定した数の列をスキップします。
例
LONG nType;
HRESULT hr;
// pEnumCol は事前にインスタンス化された IEnumCERTVIEWCOLUMN オブジェクト
hr = pEnumCol->GetType(&nType);
if (S_OK == hr)
{
switch (nType)
{
case PROPTYPE_BINARY:
printf("Type is Binary\n");
break;
case PROPTYPE_DATE:
printf("Type is Date+Time\n");
break;
case PROPTYPE_LONG:
printf("Type is Signed long\n");
break;
case PROPTYPE_STRING:
printf("Type is Unicode String\n");
break;
default:
printf("Type is unknown\n");
break;
}
}
列内のデータがインデックス付けされているかどうかを報告します。
| pIndexed | INT* | inout | データがインデックス付けされている場合は TRUE、インデックス付けされていない場合は FALSE を示す LONG 型の変数へのポインター。pIndexed が NULL に設定されている場合、このメソッドは失敗します。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、pIndexed には TRUE または FALSE が設定されます。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
列がインデックス付けされている場合は 1、それ以外の場合は 0 です。解説(Remarks)
このメソッドは、列の列挙シーケンスが現在参照している列のデータがインデックス付けされているかどうかを判定するために使用します。
列の列挙シーケンスが有効な列を参照していない場合、IsIndexed は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください。
- IEnumCERTVIEWCOLUMN::Reset: 列挙シーケンスの先頭に移動します。
- IEnumCERTVIEWCOLUMN::Next: 列挙シーケンス内の次の列に移動します。
- IEnumCERTVIEWCOLUMN::Skip: 指定した数の列をスキップします。
例
HRESULT hr;
LONG bIsindexed;
// pEnumCol は事前にインスタンス化された IEnumCERTVIEWCOLUMN オブジェクト
hr = pEnumCol->IsIndexed(&bIsindexed);
if (S_OK == hr)
printf( bIsindexed ? "Indexed\n" : "Not indexed\n");
列データの最大許容長(バイト単位)を取得します。
| pMaxLength | INT* | inout | 列データの最大許容長を格納する LONG 型の値へのポインター。pMaxLength が NULL の場合、この関数は失敗します。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、pMaxLength には列データの最大許容長が設定されます。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、列データの最大許容長(バイト単位)です。解説(Remarks)
このメソッドは、列の列挙シーケンスが現在参照している列の最大許容データ長を判定するために使用します。
列の列挙シーケンスが有効な列を参照していない場合、GetMaxLength は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください。
- IEnumCERTVIEWCOLUMN::Reset: 列挙シーケンスの先頭に移動します。
- IEnumCERTVIEWCOLUMN::Next: 列挙シーケンス内の次の列に移動します。
- IEnumCERTVIEWCOLUMN::Skip: 指定した数の列をスキップします。
例
// pEnumCol は事前にインスタンス化された IEnumCERTVIEWCOLUMN オブジェクト
HRESULT hr;
LONG nLength;
// データベース長を判定する
hr = pEnumCol->GetMaxLength(&nLength);
if (S_OK == hr)
printf("max length is %d\n", nLength);
列の列挙シーケンス内の現在の列に含まれるデータ値を取得します。
| Flags | ENUM_CERT_COLUMN_VALUE_FLAGS | in | 取得するデータの出力形式を示す識別子。このパラメーターには次のいずれかの値を指定できます。 |
| pvarValue | VARIANT* | inout | データ列を格納する VARIANT 型の値へのポインター。pvarValue が NULL の場合、このメソッドは失敗します。このメソッドが正常に完了すると、pvarValue に列内のデータが格納されます。このデータの使用を終えたら、呼び出し元が VariantClear を呼び出す責任があります。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、列内のデータを表す Variant です。解説(Remarks)
このメソッドは、列の列挙シーケンスが現在参照している列内のデータを取得するために使用します。
列の列挙シーケンスが有効な列を参照していない場合、GetValue は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください。
- IEnumCERTVIEWCOLUMN::Reset: 列挙シーケンスの先頭に移動します。
- IEnumCERTVIEWCOLUMN::Next: 列挙シーケンス内の次の列に移動します。
- IEnumCERTVIEWCOLUMN::Skip: 指定した数の列をスキップします。
例
HRESULT hr;
VARIANT var;
SYSTEMTIME systime;
VariantInit(&var);
// pEnumCol は事前にインスタンス化された IEnumCERTVIEWCOLUMN オブジェクト
hr = pEnumCol->GetValue(CV_OUT_HEX, &var);
if ( FAILED (hr) )
{
printf("Failed GetValue - %x\n", hr);
goto error;
}
switch( var.vt )
{
case VT_EMPTY:
printf( "VT_EMPTY\n" );
break;
case VT_BSTR:
printf("%ws\n", var.bstrVal );
break;
case VT_DATE:
VariantTimeToSystemTime( var.date, &systime );
printf("%d.%d.%d %02d:%02d:%02d\n",
systime.wMonth,
systime.wDay,
systime.wYear,
systime.wHour,
systime.wMinute,
systime.wSecond );
break;
case VT_I2:
printf("%d\n", var.iVal );
break;
case VT_I4:
printf("%d\n", var.lVal );
break;
default:
printf("type is:%i\n", var.vt );
break;
}
// 処理完了、リソースを解放する
VariantClear( &var );
列の列挙シーケンス内で指定した数の列をスキップします。
| celt | INT | in | スキップする列の数。celt パラメーターに正の値を指定すると、列の列挙シーケンスは列挙シーケンス内を前方にスキップします。負の値を指定すると、列の列挙は列挙シーケンス内を後方にスキップします。 |
戻り値
VB
メソッドが成功した場合、S_OK を返します。戻り値 E_INVALIDARG は、celt パラメーターの負の値によって列の列挙シーケンスのインデックスが 0 未満になったことを示します。
メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
この関数が正常に完了したら、IEnumCERTVIEWCOLUMN::Next メソッドを呼び出して、列の列挙シーケンス内の現在の列を参照します。この 2 回目の呼び出しの後、次のいずれかのメソッドを呼び出すことで列内の情報を取得できます。
- IEnumCERTVIEWCOLUMN::GetName: 列のローカライズされていない名前を取得します。
- IEnumCERTVIEWCOLUMN::GetDisplayName: 列のローカライズされた名前を取得します。
- IEnumCERTVIEWCOLUMN::GetValue: 列内のデータを取得します。
- IEnumCERTVIEWCOLUMN::GetType: 列内のデータの型を取得します。
- IEnumCERTVIEWCOLUMN::GetMaxLength: 列の最大長(バイト単位)を取得します。
celt パラメーターの負の値によってインデックスが 0 未満になった場合、以降の Next 呼び出しの動作は未定義です。
celt パラメーターの正の値によってインデックスが列挙シーケンスの最後の行を超えた場合、以降の Next メソッドの呼び出しは失敗します。
例
HRESULT hr;
LONG Index;
// pEnumCol は事前にインスタンス化された IEnumCERTVIEWCOLUMN オブジェクト
// 次の 5 列をスキップする
hr = pEnumCol->Skip(5);
if (S_OK == hr)
{
// 次の列を取得する
hr = pEnumCol->Next(&Index);
if (S_OK == hr)
{
// 必要に応じてこの列を使用する。
}
}
列の列挙シーケンスの先頭に移動します。
戻り値
VB
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
このメソッドが正常に完了したら、IEnumCERTVIEWCOLUMN::Next メソッドを呼び出して、列挙内の最初の列を参照します。この 2 回目の呼び出しの後、次のいずれかのメソッドを呼び出すことで列内の情報を取得できます。
- IEnumCERTVIEWCOLUMN::GetName: 列のローカライズされていない名前を取得します。
- IEnumCERTVIEWCOLUMN::GetDisplayName: 列のローカライズされた名前を取得します。
- IEnumCERTVIEWCOLUMN::GetValue: 列内のデータを取得します。
- IEnumCERTVIEWCOLUMN::GetType: 列内のデータの型を取得します。
- IEnumCERTVIEWCOLUMN::GetMaxLength: 列の最大長(バイト単位)を取得します。
例
// pEnumCol は事前にインスタンス化された IEnumCERTVIEWCOLUMN オブジェクト
HRESULT hr;
LONG Index;
hr = pEnumCol->Reset();
if (S_OK != hr)
printf("Unable to reset pEnumCol\n");
// 適切なエラーハンドラー / 終了ルーチンを呼び出す
else
{
// 現在は列の先頭にいる
// 各列を列挙する
while (S_OK == pEnumCol->Next(&Index))
{
// 必要に応じて各列を使用する。
}
}
列の列挙シーケンスのコピーを作成します。
| ppenum | IEnumCERTVIEWCOLUMN** | out | IEnumCERTVIEWCOLUMN 型のポインターへのポインター。ppenum が NULL の場合、このメソッドは失敗します。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、複製された列の列挙シーケンスオブジェクトです。解説(Remarks)
列の列挙シーケンスは、IEnumCERTVIEWROW::EnumCertViewColumn メソッドの呼び出しによって取得されます。
例
// pEnumCol は事前にインスタンス化された IEnumCERTVIEWCOLUMN オブジェクト
IEnumCERTVIEWCOLUMN * pEnumCol2 = NULL;
HRESULT hr;
hr = pEnumCol->Clone(&pEnumCol2);
if (S_OK != hr)
printf("Unable to clone IEnumCERTVIEWCOLUMN\n");
else
{
// 必要に応じて複製されたオブジェクトを使用する
// ...
// 複製されたオブジェクトの使用を終えたら、メモリを解放する
}
if (NULL != pEnumCol2)
pEnumCol2->Release();
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IEnumCERTVIEWCOLUMN "{9C735BE2-57A5-11D1-9BDB-00C04FB683FA}" #usecom global IEnumCERTVIEWCOLUMN IID_IEnumCERTVIEWCOLUMN "{}" #comfunc global IEnumCERTVIEWCOLUMN_Next 7 var #comfunc global IEnumCERTVIEWCOLUMN_GetName 8 var #comfunc global IEnumCERTVIEWCOLUMN_GetDisplayName 9 var #comfunc global IEnumCERTVIEWCOLUMN_GetType 10 var #comfunc global IEnumCERTVIEWCOLUMN_IsIndexed 11 var #comfunc global IEnumCERTVIEWCOLUMN_GetMaxLength 12 var #comfunc global IEnumCERTVIEWCOLUMN_GetValue 13 int,var #comfunc global IEnumCERTVIEWCOLUMN_Skip 14 int #comfunc global IEnumCERTVIEWCOLUMN_Reset 15 #comfunc global IEnumCERTVIEWCOLUMN_Clone 16 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。#define global IID_IEnumCERTVIEWCOLUMN "{9C735BE2-57A5-11D1-9BDB-00C04FB683FA}" #usecom global IEnumCERTVIEWCOLUMN IID_IEnumCERTVIEWCOLUMN "{}" #comfunc global IEnumCERTVIEWCOLUMN_Next 7 sptr #comfunc global IEnumCERTVIEWCOLUMN_GetName 8 sptr #comfunc global IEnumCERTVIEWCOLUMN_GetDisplayName 9 sptr #comfunc global IEnumCERTVIEWCOLUMN_GetType 10 sptr #comfunc global IEnumCERTVIEWCOLUMN_IsIndexed 11 sptr #comfunc global IEnumCERTVIEWCOLUMN_GetMaxLength 12 sptr #comfunc global IEnumCERTVIEWCOLUMN_GetValue 13 int,sptr #comfunc global IEnumCERTVIEWCOLUMN_Skip 14 int #comfunc global IEnumCERTVIEWCOLUMN_Reset 15 #comfunc global IEnumCERTVIEWCOLUMN_Clone 16 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。