IModelIterator::GetNext メソッド (dbgmodel.h)
GetNext メソッドは反復子を前方に移動し、次に反復処理された要素をフェッチします。 オブジェクトがイテラー可能であることに加えてインデックスが作成可能で、0 以外の値を返す GetDefaultIndexDimensionality 引数によって示される場合、このメソッドは必要に応じて既定のインデックスを返してインデクサーから生成された値に戻すこともできます。 呼び出し元は 0/nullptr を渡し、インデックスを取得しないことを選択できます。 呼び出し元が部分的なインデックスを要求することは違法と見なされます (例: GetDefaultIndexDimensionality によって生成された数より小さい)。
反復子が正常に前方に移動したが、反復処理された要素の値の読み取りにエラーが発生した場合、メソッドはエラー を返し 、"object" にエラー オブジェクトを埋め込む可能性があります。 含まれている要素の反復処理の終了時に、反復子は GetNext メソッドからE_BOUNDSを返します。 それ以降の呼び出し (間に Reset 呼び出しがない限り) もE_BOUNDSを返します。
構文
HRESULT GetNext(
_COM_Errorptr_ IModelObject **object,
ULONG64 dimensions,
IModelObject **indexers,
IKeyStore **metadata
);
パラメーター
object
反復子から生成された オブジェクトは、ここで返されます。
dimensions
呼び出し元が要求している既定のインデックスのディメンションの数。 これが 0 の場合、呼び出し元は既定のインデックスを返しません。 0 以外の場合は、少なくとも既定のインデックスの次元と同じ大きい値にする必要があります。
indexers
インデクサーから返された要素に戻るために、既定のインデックスで入力されるサイズ ディメンションのバッファー。
metadata
反復処理された要素に関連付けられているメタデータがある場合は、この引数で (必要に応じて) 返されます。
戻り値
このメソッドは HRESULT を返します。
注釈
サンプル コード
// The full class is shown here for clarity on the iterator! For the sake
// of example, this iterator produces integers from 10 to
// 10 + <value of 'NumElements' key> which are indexed by a linear 0-based index.
class MyObjectIterator :
public Microsoft::WRL::RuntimeClass<
Microsoft::WRL::RuntimeClassFlags<
Microsoft::WRL::RuntimeClassType::ClassicCom
>,
IModelIterator
>
{
public:
IFACEMETHOD(Reset)()
{
m_position = m_numElements = 0;
ComPtr<IModelObject> spNumElements;
HRESULT hr = m_spContextObject->GetKeyValue(L"NumElements",
&spNumElements,
nullptr);
if (SUCCEEDED(hr))
{
VARIANT vtVal;
if (SUCCEEDED(spNumElements->GetIntrinsicValueAs(VT_UI8, &vtVal)))
{
m_numElements = vtVal.ullVal;
}
}
return hr;
}
IFACEMETHOD(GetNext)(_COM_Errorptr_ IModelObject **ppValue,
_In_ ULONG64 dimensions,
_Out_writes_(dimensions) IModelObject **ppIndexers,
_COM_Outptr_opt_result_maybe_null_ IKeyStore *ppMetadata)
{
HRESULT hr = S_OK;
*ppMetadata = nullptr;
for (ULONG64 i = 0; i < dimensions; ++i)
{
ppIndexers[i] = nullptr;
}
// We are indexable in one dimension. Verify the call is valid.
// The caller either doesn't care (dimensions == 0) or passes the number
// of dimensions we indicate (dimensions == 1)
if (dimensions != 0 && dimensions != 1)
{
return E_INVALIDARG;
}
// E_BOUNDS indicates the end of the iteration
if (m_position >= m_numElements)
{
return E_BOUNDS;
}
ComPtr<IModelObject> spValue;
ComPtr<IModelObject> spIndex;
VARAINT vtValue;
vtValue.vt = VT_UI8;
vtValue.ullVal = m_position + 10; // Just as example. We produce
// values from 10 -> 10 + 'NumElements'
hr = GetManager()->CreateIntrinsicObject(ObjectIntrinsic, &vtValue, &spValue);
if (SUCCEEDED(hr))
{
if (dimensions == 1)
{
VARIANT vtIdx;
vtIdx.vt = VT_UI8;
vtIdx.ullVal = m_position;
hr = GetManager()->CreateIntrinsicObject(ObjectIntrinsic,
&vtIdx,
&spIndex);
}
}
if (SUCCEEDED(hr))
{
*ppValue = spValue.Detach();
if (dimensions == 1)
{
ppIndexers[0] = spIndex.Detach();
}
++m_position;
}
return hr;
}
HRESULT RuntimeClassInitialize(_In_ IModelObject *pContextObject)
{
m_spContextObject = pContextObject;
return Reset();
}
private:
ULONG64 m_position;
ULONG64 m_numElements;
ComPtr<IModelObject> m_spContextObject;
};
要件
要件 | 値 |
---|---|
Header | dbgmodel.h |