IModelIterator::GetNext 方法 (dbgmodel.h)
GetNext 方法會將反覆運算器向前移動,並擷取下一個逐一查看的專案。 如果物件除了可反覆運算,而且這是由傳回非零值的 GetDefaultIndexDimensionality 自變數所指出,這個方法可能會選擇性地傳回預設索引,以從索引器傳回產生的值。 請注意,呼叫端可以選擇傳遞 0/nullptr,而不會擷取任何索引。 呼叫端要求部分索引 (不合法,例如:小於 GetDefaultIndexDimensionality) 所產生的數位。
如果反覆運算器成功向前移動,但讀取反覆運算元素的值時發生錯誤,方法可能會傳回錯誤 ,並 填入錯誤物件“object”。 在內含專案的反覆運算結束時,反覆運算器會從 GetNext 方法傳回E_BOUNDS。 除非有交錯重設呼叫,否則任何後續呼叫 () 也會傳回E_BOUNDS。
語法
HRESULT GetNext(
_COM_Errorptr_ IModelObject **object,
ULONG64 dimensions,
IModelObject **indexers,
IKeyStore **metadata
);
參數
object
這裡會傳回反覆運算器所產生的物件。
dimensions
呼叫端要求之預設索引的維度數目。 如果這是零,則呼叫端不希望傳回預設索引。 如果是非零,則至少應與預設索引的維度一樣高。
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;
};
規格需求
需求 | 值 |
---|---|
標頭 | dbgmodel.h |