Win32 API 日本語リファレンス
ホームSecurity.Cryptography.Certificates › IEnumCERTVIEWCOLUMN

IEnumCERTVIEWCOLUMN

COMIDispatch (デュアル)
IDispatch を実装(デュアルインターフェース)。HSP では comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。
IID9c735be2-57a5-11d1-9bdb-00c04fb683fa継承元IDispatch呼び出し名前(IDispatch) または vtbl自前メソッド開始 vtbl7

公式ドキュメント

列挙シーケンスの現在の行の列データを含む、列の列挙シーケンスを表します。

メソッド 10

vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。

vtbl 7 HRESULT Next(INT* pIndex)

列の列挙シーケンス内の次の列に移動します。

pIndexINT*inout列の列挙シーケンスが参照する次の列のインデックス値を格納する変数へのポインター。列挙する列がこれ以上ない場合、この変数には –1 が設定されます。pIndexNULL の場合、このメソッドは失敗します。

戻り値

C++

メソッドが成功した場合、S_OK を返し、列の列挙シーケンス内の次の列が参照されるようになります。列挙する列がこれ以上ない場合、メソッドは S_FALSE を返し、pIndex パラメーターには –1 の値が設定されます。

メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は、列の列挙シーケンスが現在参照している列のインデックス値です。列挙する列がこれ以上ない場合、戻り値は –1 です。

解説(Remarks)

このメソッドが正常に完了すると、次のいずれかのメソッドを呼び出すことで列内の情報を取得できます。

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);
vtbl 8 HRESULT GetName(LPWSTR* pstrOut)

列の列挙シーケンス内の現在の列のローカライズされていない名前を取得します。

pstrOutLPWSTR*inout列の名前を格納する BSTR 型の変数へのポインター。

戻り値

C++

メソッドが成功した場合、S_OK を返し、pstrOut パラメーターに列の名前が格納されます。

このメソッドを使用するには、BSTR 型の変数を作成し、その変数に NULL を設定して、この変数のアドレスを pstrOut として渡します。BSTR の使用を終えたら、SysFreeString 関数を呼び出して解放してください。

メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は、列の名前を含む String です。

解説(Remarks)

このメソッドは、列の列挙シーケンスが現在参照している列のローカライズされていない名前を取得するために使用します。

列の列挙シーケンスが有効な列を参照していない場合、GetName は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください。

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);
vtbl 9 HRESULT GetDisplayName(LPWSTR* pstrOut)

列の列挙シーケンス内の現在の列のローカライズされた名前を取得します。

pstrOutLPWSTR*inout列のローカライズされた名前を格納する BSTR 型の変数へのポインター。

戻り値

C++

メソッドが成功した場合、S_OK を返し、pstrOut パラメーターに列のローカライズされた名前が格納されます。

このメソッドを使用するには、BSTR 型の変数を作成し、その変数に NULL を設定して、この変数のアドレスを pstrOut として渡します。BSTR の使用を終えたら、SysFreeString 関数を呼び出して解放してください。

メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は、列のローカライズされた名前を含む String です。

解説(Remarks)

このメソッドは、列の列挙シーケンスが現在参照している列のローカライズされた名前を取得するために使用します。

列の列挙シーケンスが有効な列を参照していない場合、GetDisplayName は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください。

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);
vtbl 10 HRESULT GetType(INT* pType)

列の列挙シーケンス内の現在の列のデータ型を取得します。

pTypeINT*inout列の列挙シーケンスが参照する列のデータ型を示す LONG 型の変数へのポインター。有効なデータ型の表については、「解説」を参照してください。pType パラメーターが NULL に設定されている場合、このメソッドは失敗します。

戻り値

C++

メソッドが成功した場合、S_OK を返します。

メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は列のデータ型を表します。有効なデータ型の表については、「解説」を参照してください。

解説(Remarks)

このメソッドは、列の列挙シーケンスが現在参照している列のデータ型を判定するために使用します。有効なデータ型を次の表に示します。

データ型 意味
PROPTYPE_BINARY バイナリデータ
PROPTYPE_DATE 日付/時刻
PROPTYPE_LONG 符号付き long
PROPTYPE_STRING Unicode 文字列

列の列挙シーケンスが有効な列を参照していない場合、GetType は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください。

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;
    }
}
vtbl 11 HRESULT IsIndexed(INT* pIndexed)

列内のデータがインデックス付けされているかどうかを報告します。

pIndexedINT*inoutデータがインデックス付けされている場合は TRUE、インデックス付けされていない場合は FALSE を示す LONG 型の変数へのポインター。pIndexedNULL に設定されている場合、このメソッドは失敗します。

戻り値

C++

メソッドが成功した場合、S_OK を返し、pIndexed には TRUE または FALSE が設定されます。

メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

列がインデックス付けされている場合は 1、それ以外の場合は 0 です。

解説(Remarks)

このメソッドは、列の列挙シーケンスが現在参照している列のデータがインデックス付けされているかどうかを判定するために使用します。

列の列挙シーケンスが有効な列を参照していない場合、IsIndexed は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください。

HRESULT  hr;
LONG     bIsindexed;

// pEnumCol は事前にインスタンス化された IEnumCERTVIEWCOLUMN オブジェクト
hr = pEnumCol->IsIndexed(&bIsindexed);
if (S_OK == hr)
    printf( bIsindexed ? "Indexed\n" : "Not indexed\n");
vtbl 12 HRESULT GetMaxLength(INT* pMaxLength)

列データの最大許容長(バイト単位)を取得します。

pMaxLengthINT*inout列データの最大許容長を格納する LONG 型の値へのポインター。pMaxLengthNULL の場合、この関数は失敗します。

戻り値

C++

メソッドが成功した場合、S_OK を返し、pMaxLength には列データの最大許容長が設定されます。

メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は、列データの最大許容長(バイト単位)です。

解説(Remarks)

このメソッドは、列の列挙シーケンスが現在参照している列の最大許容データ長を判定するために使用します。

列の列挙シーケンスが有効な列を参照していない場合、GetMaxLength は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください。

列データがインデックス付けされているかどうかを判定するには、IEnumCERTVIEWCOLUMN::IsIndexed メソッドを呼び出してください。

// pEnumCol は事前にインスタンス化された IEnumCERTVIEWCOLUMN オブジェクト
HRESULT  hr;
LONG     nLength;

// データベース長を判定する
hr = pEnumCol->GetMaxLength(&nLength);
if (S_OK == hr)
    printf("max length is %d\n", nLength);
vtbl 13 HRESULT GetValue(ENUM_CERT_COLUMN_VALUE_FLAGS Flags, VARIANT* pvarValue)

列の列挙シーケンス内の現在の列に含まれるデータ値を取得します。

FlagsENUM_CERT_COLUMN_VALUE_FLAGSin

取得するデータの出力形式を示す識別子。このパラメーターには次のいずれかの値を指定できます。

意味
CV_OUT_BASE64
BEGIN/END なしの BASE64
CV_OUT_BASE64HEADER
BEGIN CERTIFICATE および END CERTIFICATE を含む BASE64
CV_OUT_BASE64REQUESTHEADER
BEGIN NEW CERTIFICATE REQUEST および END NEW CERTIFICATE REQUEST を含む BASE64
CV_OUT_BASE64X509CRLHEADER
BEGIN X509 CRL および END X509 CRL を含む BASE64
CV_OUT_BINARY
バイナリ
CV_OUT_HEX
16 進数文字列
CV_OUT_HEXADDR
アドレス/オフセット付きの 16 進数文字列
CV_OUT_HEXASCII
ASCII 付きの 16 進数文字列
CV_OUT_HEXASCIIADDR
ASCII およびアドレス/オフセット付きの 16 進数文字列
pvarValueVARIANT*inoutデータ列を格納する VARIANT 型の値へのポインター。pvarValueNULL の場合、このメソッドは失敗します。このメソッドが正常に完了すると、pvarValue に列内のデータが格納されます。このデータの使用を終えたら、呼び出し元が VariantClear を呼び出す責任があります。

戻り値

C++

メソッドが成功した場合、S_OK を返します。

メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

VB

戻り値は、列内のデータを表す Variant です。

解説(Remarks)

このメソッドは、列の列挙シーケンスが現在参照している列内のデータを取得するために使用します。

列の列挙シーケンスが有効な列を参照していない場合、GetValue は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください。

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 );
vtbl 14 HRESULT Skip(INT celt)

列の列挙シーケンス内で指定した数の列をスキップします。

celtINTinスキップする列の数。celt パラメーターに正の値を指定すると、列の列挙シーケンスは列挙シーケンス内を前方にスキップします。負の値を指定すると、列の列挙は列挙シーケンス内を後方にスキップします。

戻り値

VB

メソッドが成功した場合、S_OK を返します。

戻り値 E_INVALIDARG は、celt パラメーターの負の値によって列の列挙シーケンスのインデックスが 0 未満になったことを示します。

メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

解説(Remarks)

この関数が正常に完了したら、IEnumCERTVIEWCOLUMN::Next メソッドを呼び出して、列の列挙シーケンス内の現在の列を参照します。この 2 回目の呼び出しの後、次のいずれかのメソッドを呼び出すことで列内の情報を取得できます。

列の列挙シーケンスは、内部で 0 から始まるインデックスを保持しています。Skip メソッドを呼び出すと、celt パラメーターの設定に応じてこのインデックスが増減します。

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)
    {
        // 必要に応じてこの列を使用する。
    }
}
vtbl 15 HRESULT Reset()

列の列挙シーケンスの先頭に移動します。

戻り値

VB

メソッドが成功した場合、S_OK を返します。

メソッドが失敗した場合は、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。

解説(Remarks)

このメソッドが正常に完了したら、IEnumCERTVIEWCOLUMN::Next メソッドを呼び出して、列挙内の最初の列を参照します。この 2 回目の呼び出しの後、次のいずれかのメソッドを呼び出すことで列内の情報を取得できます。

// 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))
    {
        // 必要に応じて各列を使用する。
    }
}
vtbl 16 HRESULT Clone(IEnumCERTVIEWCOLUMN** ppenum)

列の列挙シーケンスのコピーを作成します。

ppenumIEnumCERTVIEWCOLUMN**outIEnumCERTVIEWCOLUMN 型のポインターへのポインター。ppenumNULL の場合、このメソッドは失敗します。

戻り値

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 の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 不要)。