HRESULT CNktDbModulesEnumImpl::get__NewEnum(__deref_out IUnknown** ppUnk) { CComObject<CNktEnumeratorImpl> *lpPtr = NULL; TNktComPtr<CNktDvDbModule> cDbMod; TNktComPtr<CNktDvDbModuleWrapper> cDbModWrp; TNktComPtr<INktDbModule> cIDbMod; SIZE_T i, nCount; HRESULT hRes; if (ppUnk == NULL) return E_POINTER; *ppUnk = NULL; //check internal object get_InterfaceError(&hRes); if (FAILED(hRes)) return SetupPermanentErrorInfoAndReturn(); hRes = CComObject<CNktEnumeratorImpl>::CreateInstance(&lpPtr); if (SUCCEEDED(hRes)) { lpPtr->AddRef(); //CComObject::CreateInstance returns with zero refcount nCount = lpIntObj->GetCount(); for (i=0; i<nCount && SUCCEEDED(hRes); i++) { cDbMod.Release(); hRes = lpIntObj->GetAt(i, &cDbMod); if (SUCCEEDED(hRes)) { cDbModWrp.Attach(CNktDvDbModuleWrapper::Create(cDbMod)); hRes = (cDbModWrp != NULL) ? S_OK : E_OUTOFMEMORY; } if (SUCCEEDED(hRes)) { //get outer interface cIDbMod.Release(); hRes = GetComLinkHelper<CNktDbModuleImpl,INktDbModule, CNktDvDbModuleWrapper>(&cIDbMod, cDbModWrp, InterfaceItemGetCookies()); } if (SUCCEEDED(hRes)) hRes = lpPtr->AddItem(cIDbMod); } } if (SUCCEEDED(hRes)) hRes = lpPtr->QueryInterface<IUnknown>(ppUnk); //decrement extra ref if (lpPtr != NULL) lpPtr->Release(); return hRes; }