Listing 1: FileSearch::Search().

STDMETHODIMP FileSearch::Search( BSTR searchRoot, BSTR pattern
                               , long flags, IUnknown **ppenum)
{
  HRESULT hr;
  if(NULL == ppenum)
  {
    hr = E_POINTER;
  }
  else
  {
    *ppenum = NULL;
    hrecls_t  hSrch;
#ifdef RECLS_CHAR_TYPE_IS_CHAR
    recls_rc_t  rc  = Recls_Search( winstl::w2a(searchRoot)
                        , winstl::w2a(pattern), flags, &hSrch);
#elif defined(RECLS_CHAR_TYPE_IS_WCHAR)
    recls_rc_t  rc  = Recls_Search( searchRoot, pattern, flags, &hSrch);
#endif /* RECLS_CHAR_TYPE_IS_WCHAR */
    if( RECLS_FAILED(rc) && 
        rc != RECLS_RC_NO_MORE_DATA)
    {
      set_error_info_from_recls_rc_t(rc);
      hr = E_FAIL;
    }
    else
    {
      typedef CComObject<SearchCollection>  _Search_t;
      _Search_t *pSrch = new _Search_t();
      if(NULL == pSrch)
      {
        Recls_SearchClose(hSrch);
        hr = E_OUTOFMEMORY;
      }
      else
      {
        pSrch->AddRef();
        SearchInfo  info;
        if(rc == RECLS_RC_NO_MORE_DATA)
        {
          info.bEmpty     = true;
        }
        else
        {
          info.hSrch      = hSrch;
          info.flags      = flags;
          info.pattern    = pattern;
          info.searchRoot = searchRoot;
        }
        pSrch->SetVoid(&info);
        ATLASSERT(NULL == info.hSrch);
        *ppenum = pSrch;
        hr = S_OK;
      }
    }
  }
  return hr;
}