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;
};
要求
要求 | 值 |
---|---|
Header | dbgmodel.h |