IEnumCERTVIEWEXTENSION
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
行列挙シーケンスの現在の行に対応する証明書拡張データを格納する、拡張列挙シーケンスを表します。
メソッド 7
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;
LONG nCount;
// 拡張の数を求める
nCount = 0;
// pEnumExt は事前にインスタンス化された IEnumCERTVIEWEXTENSION オブジェクト
while (S_OK == pEnumExt->Next(&Index))
{
nCount++;
}
printf("Number of extensions is %d\n", nCount);
拡張列挙シーケンス内の現在の拡張の名前を取得します。
| pstrOut | LPWSTR* | inout | 拡張の名前を格納する BSTR 型の値へのポインター。 |
戻り値
C++
メソッドが成功した場合、S_OK を返し、pstrOut パラメーターに拡張の名前が設定されます。このメソッドを使用するには、BSTR 型の変数を作成し、その変数に NULL を設定して、この変数のアドレスを pstrOut として渡します。BSTR の使用が終わったら、SysFreeString 関数を呼び出して解放してください。
メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、拡張の名前を格納する String です。解説(Remarks)
この関数は、拡張列挙シーケンスが現在参照している 拡張の名前を取得するために使用します。
拡張列挙シーケンスが有効な拡張を参照していない場合、GetName は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください:
- IEnumCERTVIEWEXTENSION::Reset: 列挙シーケンスの先頭へ移動します。
- IEnumCERTVIEWEXTENSION::Next: 列挙シーケンス内の次の拡張へ移動します。
- IEnumCERTVIEWEXTENSION::Skip: 指定した数の拡張をスキップします。
例
BSTR bstrExtName = NULL;
// pEnumExt は事前にインスタンス化された IEnumCERTVIEWEXTENSION オブジェクト
hr = pEnumExt->GetName(&bstrExtName);
if (S_OK == hr)
printf("Extension name is: %ws\n", bstrExtName);
else
printf("GetName failed: %x\n", hr);
// 完了したらメモリを解放する
if (NULL != bstrExtName)
SysFreeString(bstrExtName);
拡張列挙シーケンス内の現在の拡張のポリシーフラグと発生元フラグを取得します。
| pFlags | INT* | inout | 拡張のポリシーフラグと発生元フラグを格納する LONG 型へのポインター。pFlags パラメーターが NULL に設定されている場合、このメソッドは失敗します。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、拡張のポリシー値と発生元値を表します。解説(Remarks)
このメソッドは、拡張列挙シーケンスが現在参照している 拡張のポリシーフラグと発生元フラグを取得するために使用します。
ポリシーフラグは証明書拡張に関する情報を提供し、ポリシーモジュールによって設定できます。
発生元フラグは、証明書拡張を設定したモジュールを示し、サーバーエンジンによってのみ設定されます。
1 つの拡張から 1 つ以上のポリシーフラグを返すことができます。定義済みのポリシーフラグは次のとおりです。
| ポリシーフラグの値 | 説明 |
|---|---|
| EXTENSION_CRITICAL_FLAG | これはクリティカルな拡張です。 |
| EXTENSION_DISABLE_FLAG | 拡張は使用されません。 |
次の発生元フラグのいずれかを返すこともできます。
| 発生元フラグの値 | 説明 |
|---|---|
| EXTENSION_ORIGIN_REQUEST | 拡張は、PKCS #10 要求の szOID_CERT_EXTENSIONS (1.3.6.1.4.1.311.2.1.14) 属性または szOID_RSA_certExtensions (1.2.840.113549.1.9.14) 属性に格納された拡張の配列から抽出されました。 |
| EXTENSION_ORIGIN_POLICY | ポリシーモジュールが拡張を設定しました。 |
| EXTENSION_ORIGIN_ADMIN | 管理者が拡張を設定しました。 |
| EXTENSION_ORIGIN_SERVER | サーバーエンジンが拡張を設定しました。 |
| EXTENSION_ORIGIN_RENEWALCERT | 拡張は、PKCS #10 更新要求の szOID_RENEWAL_CERTIFICATE (1.3.6.1.4.1.311.13.1) 属性に格納された証明書から抽出されました。 |
| EXTENSION_ORIGIN_IMPORTEDCERT | 拡張は、インポートされた証明書から抽出されました (証明書は ICertAdmin::ImportCertificate に渡されました)。 |
| EXTENSION_ORIGIN_PKCS7 | 拡張は、PKCS #7 要求の szOID_CERT_EXTENSIONS (1.3.6.1.4.1.311.2.1.14) 属性または szOID_RSA_certExtensions (1.2.840.113549.1.9.14) 属性に格納された拡張の配列から抽出されました。 |
戻り値でどのフラグが設定されているかを判別しやすくするために、定義済みのマスクが用意されています。用意されているマスクは次のとおりです。
| マスクの値 | 説明 |
|---|---|
| EXTENSION_POLICY_MASK | この値 (0x0000FFFF) は、ポリシーフラグを調べるために使用します。 |
| EXTENSION_ORIGIN_MASK | この値 (0x000F0000) は、発生元フラグを調べるために使用します。 |
拡張列挙シーケンスが有効な拡張を参照していない場合、GetFlags は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください:
- IEnumCERTVIEWEXTENSION::Reset: 列挙シーケンスの先頭へ移動します。
- IEnumCERTVIEWEXTENSION::Next: 列挙シーケンス内の次の拡張へ移動します。
- IEnumCERTVIEWEXTENSION::Skip: 指定した数の拡張をスキップします。
例
HRESULT hr;
LONG ExtFlags;
// pEnumExt は事前にインスタンス化された IEnumCERTVIEWEXTENSION オブジェクト
hr = pEnumExt->GetFlags(&ExtFlags);
if (S_OK != hr)
printf("Failed GetFlags - %x\n", hr);
else
{
LONG ExtPol, ExtOrig;
ExtPol = ExtFlags & EXTENSION_POLICY_MASK;
if (ExtPol & EXTENSION_CRITICAL_FLAG)
printf("The extension is critical\n");
if (ExtPol & EXTENSION_DISABLE_FLAG )
printf("The extension is disabled\n");
ExtOrig = ExtFlags & EXTENSION_ORIGIN_MASK;
switch (ExtOrig)
{
case EXTENSION_ORIGIN_REQUEST:
printf("Extension originated by PKCS #10 Request\n");
break;
case EXTENSION_ORIGIN_POLICY:
printf("Extension originated by Policy\n");
break;
case EXTENSION_ORIGIN_ADMIN:
printf("Extension originated by Admin\n");
break;
case EXTENSION_ORIGIN_SERVER:
printf("Extension originated by Server\n");
break;
case EXTENSION_ORIGIN_RENEWALCERT:
printf("Extension originated by Renewal Request\n");
break;
case EXTENSION_ORIGIN_IMPORTEDCERT:
printf("Extension originated by an imported "
"certificate\n");
break;
case EXTENSION_ORIGIN_PKCS7:
printf("Extension originated by PKCS #7 Request\n");
break;
default:
printf("Unknown extension origin\n");
break;
}
}
拡張列挙シーケンス内の現在の拡張の値を取得します。
| Type | CERT_PROPERTY_TYPE | in | 返されるデータのデータ型。このパラメーターを使用して、拡張データを返す前にデコードするよう指定できます。PROPTYPE_BINARY が指定された場合、データはデコードされず、代わりに未加工の形式で返されます。 次のいずれかの値を指定します。
| ||||||||||
| Flags | ENUM_CERT_COLUMN_VALUE_FLAGS | in | 返されるデータの出力形式を示すフラグ。このパラメーターには、次のいずれかの値を指定できます。 | ||||||||||
| pvarValue | VARIANT* | inout | 現在参照されている拡張のデータを格納する VARIANT 型の値へのポインター。pvarValue パラメーターが NULL の場合、このメソッドは失敗します。この関数が正常に完了すると、pvarValue には拡張列挙シーケンスが現在参照している拡張データが格納されます。呼び出し元は、VariantClear を、pvarValue 内のデータの使用が終わったら呼び出す責任があります。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、拡張内のデータを表す Variant です。解説(Remarks)
このメソッドは、拡張列挙シーケンスが現在参照している 拡張内のデータを取得するために使用します。
拡張列挙シーケンスが有効な拡張を参照していない場合、GetValue は失敗します。列挙内を移動するには、次のいずれかのメソッドを使用してください:
- IEnumCERTVIEWEXTENSION::Reset: 列挙シーケンスの先頭へ移動します。
- IEnumCERTVIEWEXTENSION::Next: 列挙シーケンス内の次の拡張へ移動します。
- IEnumCERTVIEWEXTENSION::Skip: 指定した数の拡張をスキップします。
例
VARIANT var;
LONG Index;
HRESULT hr;
SYSTEMTIME systime;
VariantInit(&var);
// 各拡張を列挙する
// pEnumExt は事前にインスタンス化された IEnumCERTVIEWEXTENSION オブジェクト
while (S_OK == pEnumExt->Next(&Index))
{
hr = pEnumExt->GetValue(PROPTYPE_BINARY, CV_OUT_HEX, &var);
if (FAILED(hr))
{
printf("Failed GetValue - %x\n", hr);
break;
}
switch(var.vt)
{
case VT_EMPTY:
printf("VT_EMPTY\n");
break;
case VT_BSTR:
printf("BSTR:%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 パラメーターに正の値を指定すると、拡張列挙シーケンスはシーケンス内を前方へスキップします。celt パラメーターに負の値を指定すると、拡張列挙シーケンスはシーケンス内を後方へスキップします。 |
戻り値
VB
メソッドが成功した場合、S_OK を返します。戻り値が E_INVALIDARG の場合、celt パラメーターの負の値によって拡張列挙シーケンスのインデックスがゼロ未満になったことを示します。
メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
このメソッドが正常に完了したら、 IEnumCERTVIEWEXTENSION::Next メソッドを呼び出して、拡張列挙シーケンス内の現在の拡張を参照します。拡張の名前、フラグ、値には、次のメソッドを通じてアクセスできます:
拡張列挙シーケンスは、ゼロから始まる内部インデックスを保持します。Skip メソッドを呼び出すと、このインデックスは celt パラメーターで指定された拡張の数だけ増加または減少します。celt パラメーターの負の値によってインデックスがゼロ未満になった場合、以降の IEnumCERTVIEWEXTENSION::Next の呼び出しの動作は未定義となります。
celt パラメーターの正の値によってインデックスが列挙シーケンスの最後の拡張を超えた場合、以降の IEnumCERTVIEWEXTENSION::Next メソッドの呼び出しは失敗します。
例
HRESULT hr;
LONG Index;
// pEnumExt は事前にインスタンス化された IEnumCERTVIEWEXTENSION オブジェクト
// 次の 5 個の拡張をスキップする
hr = pEnumExt->Skip(5);
if (S_OK == hr)
{
// 次の拡張を取得する
hr = pEnumExt->Next(&Index);
if (S_OK == hr)
{
// 必要に応じてこの拡張を使用する
}
}
拡張列挙シーケンスの先頭へ移動します。
戻り値
VB
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
解説(Remarks)
このメソッドが正常に完了したら、 IEnumCERTVIEWEXTENSION::Next メソッドを呼び出して、拡張列挙シーケンス内の最初の拡張を参照します。
拡張の名前、フラグ、値には、次のメソッドを使用してアクセスできます:
例
HRESULT hr;
LONG Index;
// pEnumExt は事前にインスタンス化された IEnumCERTVIEWEXTENSION オブジェクト
hr = pEnumExt->Reset();
if (S_OK != hr)
printf("Unable to reset pEnumExt - %x\n", hr);
// 適切なエラーハンドラーを呼び出して終了処理を行う
else
{
// 再び拡張の先頭にリセットする
while (S_OK == pEnumExt->Next(&Index))
{
// 必要に応じて各拡張を使用する
}
}
拡張列挙シーケンスのコピーを作成します。
| ppenum | IEnumCERTVIEWEXTENSION** | out | IEnumCERTVIEWEXTENSION 型のポインターへのポインター。ppenum パラメーターが NULL の場合、このメソッドは失敗します。 |
戻り値
C++
メソッドが成功した場合、S_OK を返します。メソッドが失敗した場合、エラーを示す HRESULT 値を返します。一般的なエラーコードの一覧については、Common HRESULT Values を参照してください。
VB
戻り値は、複製された拡張列挙シーケンスオブジェクトです。解説(Remarks)
拡張列挙シーケンスオブジェクトは、IEnumCERTVIEWROW::EnumCertViewExtension メソッドの呼び出しによって取得されます。
例
IEnumCERTVIEWEXTENSION * pEnumExt2 = NULL;
HRESULT hr;
// pEnumExt は事前にインスタンス化された IEnumCERTVIEWEXTENSION オブジェクト
hr = pEnumExt->Clone(&pEnumExt2);
if (S_OK != hr)
printf("Unable to clone IEnumCERTVIEWEXTENSION\n");
else
{
// 必要に応じて複製したオブジェクトを使用する
//...
}
// 複製したオブジェクトの使用が終わったら、メモリを解放する
if (NULL != pEnumExt2)
pEnumExt2->Release();
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IEnumCERTVIEWEXTENSION "{E7DD1466-7653-11D1-9BDE-00C04FB683FA}" #usecom global IEnumCERTVIEWEXTENSION IID_IEnumCERTVIEWEXTENSION "{}" #comfunc global IEnumCERTVIEWEXTENSION_Next 7 var #comfunc global IEnumCERTVIEWEXTENSION_GetName 8 var #comfunc global IEnumCERTVIEWEXTENSION_GetFlags 9 var #comfunc global IEnumCERTVIEWEXTENSION_GetValue 10 int,int,var #comfunc global IEnumCERTVIEWEXTENSION_Skip 11 int #comfunc global IEnumCERTVIEWEXTENSION_Reset 12 #comfunc global IEnumCERTVIEWEXTENSION_Clone 13 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。#define global IID_IEnumCERTVIEWEXTENSION "{E7DD1466-7653-11D1-9BDE-00C04FB683FA}" #usecom global IEnumCERTVIEWEXTENSION IID_IEnumCERTVIEWEXTENSION "{}" #comfunc global IEnumCERTVIEWEXTENSION_Next 7 sptr #comfunc global IEnumCERTVIEWEXTENSION_GetName 8 sptr #comfunc global IEnumCERTVIEWEXTENSION_GetFlags 9 sptr #comfunc global IEnumCERTVIEWEXTENSION_GetValue 10 int,int,sptr #comfunc global IEnumCERTVIEWEXTENSION_Skip 11 int #comfunc global IEnumCERTVIEWEXTENSION_Reset 12 #comfunc global IEnumCERTVIEWEXTENSION_Clone 13 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。 ; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。