IEnumVARIANT
COM公式ドキュメント
バリアントのコレクション(オブジェクトと組み込み型が混在する異種コレクションを含む)を列挙するためのメソッドを提供します。
解説(Remarks)
IEnumVARIANT を使用してオブジェクトのコレクションを実装する方法については、Lines サンプルコードの Enumvar.cpp ファイルを参照してください。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
列挙シーケンス内の指定された項目を取得します。
| celt | DWORD | in | 取得する要素の数。 |
| rgVar | VARIANT* | out | 要素を返すための、少なくとも celt のサイズを持つ配列。 |
| pCeltFetched | DWORD* | out | rgVar に返された要素の数、または NULL。 |
戻り値
解説(Remarks)
シーケンスに残っている要素が要求された数より少ない場合、Next は残りの要素のみを返します。実際の要素数は、null でない限り pCeltFetched に返されます。
例
以下のコードは IEnumVariant::Next を実装しています。IEnumVariant インターフェースの完全な実装例は、COM Fundamentals の Lines サンプル(Enumvar.cpp)にあります。
STDMETHODIMP
CEnumVariant::Next(ULONG cElements, VARIANT * pvar, ULONG * pcElementFetched)
{
HRESULT hr;
ULONG l;
long l1;
ULONG l2;
if (pcElementFetched != NULL)
*pcElementFetched = 0;
if (pvar == NULL)
return E_INVALIDARG;
for (l=0; l<cElements; l++)
VariantInit(&pvar[l]);
// Retrieve the next cElements elements.
// m_lLBound+m_cElements = # of elements in the m_psa collection.
for (l1=m_lCurrent, l2=0; l1<(long)(m_lLBound+m_cElements) &&
l2<cElements; l1++, l2++)
{
hr = SafeArrayGetElement(m_psa, &l1, &pvar[l2]);
if (FAILED(hr))
goto error;
}
// Set count of elements retrieved.
if (pcElementFetched != NULL)
*pcElementFetched = l2;
m_lCurrent = l1;
return (l2 < cElements) ? S_FALSE : NOERROR;
error:
for (l=0; l<cElements; l++)
VariantClear(&pvar[l]);
return hr;
}
列挙シーケンス内の次の celt 個の要素をスキップしようとします。
| celt | DWORD | in | スキップする要素の数。 |
戻り値
このメソッドは次のいずれかの値を返すことがあります。
| 戻り値コード | 説明 |
|---|---|
| 指定された数の要素がスキップされました。 | |
| 要求された数の要素をスキップする前にシーケンスの末尾に到達しました。 |
列挙シーケンスを先頭にリセットします。(IEnumVARIANT.Reset)
戻り値
解説(Remarks)
2 回目の列挙で 1 回目とまったく同じバリアントの集合が列挙されるという保証はありません。完全に同一であることが望ましいものの、結果は列挙対象のコレクションに依存します。コレクションによっては、この条件を維持することが現実的でない場合があります(例えば、ディレクトリ内のファイルの列挙など)。
例
以下のコードは IEnumVariant::Reset を実装しています。IEnumVariant インターフェースの完全な実装例は、COM Fundamentals の Lines サンプル(Enumvar.cpp)にあります。
STDMETHODIMP
CEnumVariant::Reset()
{
m_lCurrent = m_lLBound;
return NOERROR;
}
現在の列挙状態のコピーを作成します。
| ppEnum | IEnumVARIANT** | out | 複製された列挙子。 |
戻り値
このメソッドは次のいずれかの値を返すことがあります。
| 戻り値コード | 説明 |
|---|---|
| 成功しました。 | |
| 操作を完了するためのメモリが不足しています。 |
解説(Remarks)
この関数を使用すると、列挙シーケンス内の特定の位置を記録し、後でその位置に戻ることができます。返される列挙子は、複製元と同じ実際のインターフェースを持ちます。
2 回目の列挙で 1 回目とまったく同じバリアントの集合が列挙されるという保証はありません。完全に同一であることが望ましいものの、結果は列挙対象のコレクションに依存します。コレクションによっては、この条件を維持することが現実的でない場合があります(例えば、ディレクトリ内のファイルの列挙など)。
例
以下のコードは IEnumVariant::Clone を実装しています。IEnumVariant インターフェースの完全な実装例は、COM Fundamentals の Lines サンプル(Enumvar.cpp)にあります。
STDMETHODIMP
CEnumVariant::Clone(IEnumVARIANT ** ppenum)
{
CEnumVariant * penum = NULL;
HRESULT hr;
if (ppenum == NULL)
return E_INVALIDARG;
*ppenum = NULL;
hr = CEnumVariant::Create(m_psa, m_cElements, &penum);
if (FAILED(hr))
goto error;
penum->AddRef();
penum->m_lCurrent = m_lCurrent;
*ppenum = penum;
return NOERROR;
error:
if (penum)
penum->Release();
return hr;
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IEnumVARIANT "{00020404-0000-0000-C000-000000000046}" #usecom global IEnumVARIANT IID_IEnumVARIANT "{}" #comfunc global IEnumVARIANT_Next 3 int,var,var #comfunc global IEnumVARIANT_Skip 4 int #comfunc global IEnumVARIANT_Reset 5 #comfunc global IEnumVARIANT_Clone 6 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IEnumVARIANT "{00020404-0000-0000-C000-000000000046}" #usecom global IEnumVARIANT IID_IEnumVARIANT "{}" #comfunc global IEnumVARIANT_Next 3 int,sptr,sptr #comfunc global IEnumVARIANT_Skip 4 int #comfunc global IEnumVARIANT_Reset 5 #comfunc global IEnumVARIANT_Clone 6 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。