GetNext 方法向前移动迭代器并提取下一个迭代元素。 如果对象除了可循环访问,而且由返回非零值的 GetDefaultIndexDimensionality 参数指示,此方法还可以选择返回默认索引以从索引器返回生成的值。 请注意,调用方可以选择传递 0/nullptr,而不检索任何索引。 调用方请求部分索引(例如:小于 GetDefaultIndexDimensionality 生成的数字)是非法的。
如果迭代器成功向前移动,但在读取迭代元素的值时出错,该方法可能会返回错误 AND 用错误对象填充“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 |