///////////////////////////////////////////////////////////////// // CBase::ReleaseChildren // ///////////////////////////////////////////////////////////////// HRESULT CBase::ReleaseChildren() { //Make our lives easier... CObjTree* pCObjTree = m_pCMainWindow->m_pCMDIObjects->m_pCObjTree; //No-op if(!m_hTreeItem || !pCObjTree->m_hWnd) return S_OK; BOOL bAllRemoved = TRUE; //Try to obtain the first child... HTREEITEM hChildItem = pCObjTree->GetChildItem(m_hTreeItem); while(hChildItem) { //NOTE: Before deleting this node of the tree, obtain the //next sibling (if there is one...). Since we can't do this after the node has been deleted! HTREEITEM hNextSibling = pCObjTree->GetNextItem(hChildItem); CBase* pCChild = (CBase*)pCObjTree->GetItemParam(hChildItem); if(pCChild) { //Make sure all its children are released (recurse) //If this child cannot be released, we still can continue on to the next child //(ie: release everything we can - not all or nothing...) if(SUCCEEDED(pCChild->ReleaseChildren())) { //Now we can release this child pCChild->ReleaseObject(); } } //Go to the next sibling... hChildItem = hNextSibling; } return bAllRemoved ? S_OK : E_FAIL; }