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