다음을 통해 공유


IModelIterator::GetNext 메서드(dbgmodel.h)

GetNext 메서드는 반복기를 앞으로 이동하고 다음 반복된 요소를 가져옵니다. 개체를 반복할 수 있을 뿐 아니라 인덱싱할 수 있고 0이 아닌 값을 반환하는 GetDefaultIndexDimensionality 인수로 표시되는 경우 이 메서드는 선택적으로 기본 인덱스를 반환하여 인덱서에서 생성된 값으로 돌아갈 수 있습니다. 호출자는 0/nullptr을 전달하고 인덱스를 검색하지 않도록 선택할 수 있습니다. 호출자가 부분 인덱스를 요청하는 것은 잘못된 것으로 간주됩니다(예: GetDefaultIndexDimensionality에서 생성된 수보다 작음).

반복기가 성공적으로 앞으로 이동했지만 반복된 요소의 값을 읽는 동안 오류가 발생한 경우 메서드는 오류를 반환 하고 "object"를 오류 개체로 채울 수 있습니다. 포함된 요소의 반복이 끝나면 반복기는 GetNext 메서드에서 E_BOUNDS 반환합니다. 후속 호출(중간 초기화 호출이 없는 경우)도 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;

};

요구 사항

요구 사항
헤더 dbgmodel.h

추가 정보

IModelIterator 인터페이스