Listing 3: SearchCollection::get__NewEnum().
STDMETHODIMP SearchCollection::get__NewEnum(LPUNKNOWN *ppenum)
{
HRESULT hr;
if(NULL == ppenum)
{
hr = E_POINTER;
}
else
{
*ppenum = NULL;
EnumEntry *pee = new CComObject<EnumEntry>();
if(NULL == pee)
{
hr = E_OUTOFMEMORY;
}
else
{
hr = S_OK;
if( NULL == m_info.hSrch &&
!m_info.bEmpty)
{
// This collection has already been used to spawn a
// search, so we need to start another one.
recls_rc_t rc = Recls_Search( . . . );
if(rc != RECLS_RC_NO_MORE_DATA)
{
m_info.bEmpty = true;
}
else if(RECLS_FAILED(rc))
{
set_error_info_from_recls_rc_t(rc);
delete pee;
hr = E_FAIL;
}
}
if(SUCCEEDED(hr))
{
pee->SetVoid(&m_info);
ATLASSERT(NULL == m_info.hSrch);
*ppenum = static_cast<IEnumVARIANT*>(pee);
(*ppenum)->AddRef();
}
}
}
return hr;
}