Win32 API 日本語リファレンス
ホームSystem.Ole › IEnumVARIANT

IEnumVARIANT

COM
IID00020404-0000-0000-c000-000000000046継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

バリアントのコレクション(オブジェクトと組み込み型が混在する異種コレクションを含む)を列挙するためのメソッドを提供します。

解説(Remarks)

IEnumVARIANT を使用してオブジェクトのコレクションを実装する方法については、Lines サンプルコードの Enumvar.cpp ファイルを参照してください。

メソッド 4

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT Next(DWORD celt, VARIANT* rgVar, DWORD* pCeltFetched)

列挙シーケンス内の指定された項目を取得します。

celtDWORDin取得する要素の数。
rgVarVARIANT*out要素を返すための、少なくとも celt のサイズを持つ配列。
pCeltFetchedDWORD*outrgVar に返された要素の数、または NULL。

戻り値

このメソッドは次のいずれかの値を返すことがあります。

戻り値コード 説明
S_OK
返された要素の数は celt です。
S_FALSE
返された要素の数は celt より少ないです。

解説(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;
}
vtbl 4 HRESULT Skip(DWORD celt)

列挙シーケンス内の次の celt 個の要素をスキップしようとします。

celtDWORDinスキップする要素の数。

戻り値

このメソッドは次のいずれかの値を返すことがあります。

戻り値コード 説明
S_OK
指定された数の要素がスキップされました。
S_FALSE
要求された数の要素をスキップする前にシーケンスの末尾に到達しました。
vtbl 5 HRESULT Reset()

列挙シーケンスを先頭にリセットします。(IEnumVARIANT.Reset)

戻り値

このメソッドは次のいずれかの値を返すことがあります。

戻り値コード 説明
S_OK
成功しました。
S_FALSE
失敗しました。

解説(Remarks)

2 回目の列挙で 1 回目とまったく同じバリアントの集合が列挙されるという保証はありません。完全に同一であることが望ましいものの、結果は列挙対象のコレクションに依存します。コレクションによっては、この条件を維持することが現実的でない場合があります(例えば、ディレクトリ内のファイルの列挙など)。

以下のコードは IEnumVariant::Reset を実装しています。IEnumVariant インターフェースの完全な実装例は、COM Fundamentals の Lines サンプル(Enumvar.cpp)にあります。

STDMETHODIMP
CEnumVariant::Reset()
{
   m_lCurrent = m_lLBound;
   return NOERROR;
}
vtbl 6 HRESULT Clone(IEnumVARIANT** ppEnum)

現在の列挙状態のコピーを作成します。

ppEnumIEnumVARIANT**out複製された列挙子。

戻り値

このメソッドは次のいずれかの値を返すことがあります。

戻り値コード 説明
S_OK
成功しました。
E_OUTOFMEMORY
操作を完了するためのメモリが不足しています。

解説(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 の 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_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 指定が可能。