Метод IModelIterator::GetNext (dbgmodel.h)

Метод GetNext перемещает итератор вперед и получает следующий итерированный элемент. Если объект является индексируемым в дополнение к итерации и на это указывает аргумент GetDefaultIndexDimensionality, возвращающий ненулевое значение, этот метод может при необходимости возвращать индексы по умолчанию, чтобы вернуться к полученному значению из индексатора. Обратите внимание, что вызывающий объект может передать значение 0/nullptr и не получать индексы. Запрос частичных индексов (например, меньше числа, созданного методом GetDefaultIndexDimensionality), считается недопустимым.

Если итератор успешно перешел вперед, но при чтении значения итерированного элемента произошла ошибка, метод может вернуть ошибку AND заполнить "объект" объектом ошибки. В конце итерации содержащихся элементов итератор вернет E_BOUNDS из метода GetNext. Любой последующий вызов (если не был промежуточный вызов сброса) также вернет 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

См. также раздел

Интерфейс IModelIterator