Bagikan melalui


IModelIterator::GetNext method (dbgmodel.h)

Metode GetNext memindahkan iterator ke depan dan mengambil elemen iterasi berikutnya. Jika objek dapat diindeks selain dapat diulang dan ini ditunjukkan oleh argumen GetDefaultIndexDimensionality yang mengembalikan nilai bukan nol, metode ini dapat secara opsional mengembalikan indeks default untuk kembali ke nilai yang dihasilkan dari pengindeks. Perhatikan bahwa penelepon dapat memilih untuk meneruskan 0/nullptr dan tidak mengambil indeks apa pun. Dianggap ilegal bagi penelepon untuk meminta indeks parsial (misalnya: kurang dari angka yang dihasilkan oleh GetDefaultIndexDimensionality).

Jika iterator berhasil bergerak maju tetapi ada kesalahan dalam membaca nilai elemen yang diulang, metode dapat mengembalikan kesalahan DAN mengisi "objek" dengan objek kesalahan. Di akhir iterasi elemen yang terkandung, iterator akan mengembalikan E_BOUNDS dari metode GetNext. Setiap panggilan berikutnya (kecuali telah ada panggilan Reset yang mengintervensi) juga akan mengembalikan E_BOUNDS.

Sintaks

HRESULT GetNext(
  _COM_Errorptr_ IModelObject **object,
  ULONG64                     dimensions,
  IModelObject                **indexers,
  IKeyStore                   **metadata
);

Parameter

object

Objek yang dihasilkan dari iterator dikembalikan di sini.

dimensions

Jumlah dimensi indeks default yang diminta pemanggil. Jika ini nol, pemanggil tidak ingin indeks default dikembalikan. Jika bukan nol, setidaknya harus setingkat dimensi indeks default.

indexers

Buffer dimensi ukuran yang akan diisi dengan indeks default untuk kembali ke elemen yang dikembalikan dari pengindeks.

metadata

Jika ada metadata yang terkait dengan elemen yang diulang, metadata dikembalikan (opsional) dalam argumen ini.

Menampilkan nilai

Metode ini mengembalikan HRESULT.

Keterangan

Kode Sampel

// 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;

};

Persyaratan

Persyaratan Nilai
Header dbgmodel.h

Lihat juga

Antarmuka IModelIterator