IShellFolder * CPropertiesCtrl::GetFolderByPath( IShellFolder * piParent, const TCHAR * sPathFolder, LPITEMIDLIST * ppItem, CSCADString& sName, IExtractIcon ** ppiIcon ) { if( !sPathFolder || !*sPathFolder ) return NULL; OLECHAR olePath[MAX_PATH]; OLECHAR * sPath; ULONG chEaten; ULONG dwAttributes; HRESULT hr; _STRRET strret; LPSHELLFOLDER piResFolder = NULL; bool bMustRelease = false; CComPtr<IShellFolder> piFolder; CComPtr<IMalloc> piMalloc; if( !piParent ) { SHGetDesktopFolder( &piFolder ); bMustRelease = true; } else piFolder = piParent; if( !piFolder ) return NULL; #ifndef UNICODE MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, sPathFolder, -1, olePath, MAX_PATH ); sPath = (OLECHAR*)olePath; #else sPath = sPathFolder; #endif //UNICODE hr = piFolder->ParseDisplayName( NULL, NULL, sPath, &chEaten, ppItem, &dwAttributes ); if( FAILED( hr ) ) return NULL; hr = piFolder->GetDisplayNameOf( *ppItem, SHGDN_NORMAL, &strret ); SHGetMalloc( &piMalloc ); sName = StrRetToStr(*ppItem, strret, true, piMalloc ); *ppiIcon = NULL; hr = piFolder->GetUIObjectOf( NULL, 1, (LPCITEMIDLIST*)ppItem, IID_IExtractIcon, NULL, (void**)ppiIcon ); hr = piFolder->BindToObject( *ppItem, 0, IID_IShellFolder, (void**)&piResFolder ); return piResFolder; }
stdstring ItemIDList::toString() { IShellFolder *shellFolder = NULL; IShellFolder *parentFolder = NULL; STRRET name; TCHAR * szDisplayName = NULL; stdstring ret; HRESULT hr; hr = ::SHGetDesktopFolder(&shellFolder); if (!SUCCEEDED(hr)) return ret; if (parent_) { hr = shellFolder->BindToObject(parent_, 0, IID_IShellFolder, (void**) &parentFolder); if (!SUCCEEDED(hr)) parentFolder = shellFolder; } else { parentFolder = shellFolder; } if ((parentFolder != 0)&&(item_ != 0)) { hr = parentFolder->GetDisplayNameOf(item_, SHGDN_NORMAL | SHGDN_FORPARSING, &name); if (!SUCCEEDED(hr)) { parentFolder->Release(); return ret; } hr = StrRetToStr (&name, item_, &szDisplayName); if (!SUCCEEDED(hr)) return ret; } parentFolder->Release(); if (szDisplayName == NULL) { CoTaskMemFree(szDisplayName); return ret; //to avoid a crash! } ret = szDisplayName; CoTaskMemFree(szDisplayName); return ret; }
///////////////////////////////////////////////////////////////////////////// // IShellInit Functions ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CShellExt::XShellInit::Initialize(LPCITEMIDLIST pidlFolder, IDataObject *pdobj, HKEY hkeyProgID) { METHOD_PROLOGUE(CShellExt, ShellInit); HRESULT hres = E_FAIL; FORMATETC fmte = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; STGMEDIUM medium; // We must have a data object if ((pdobj == NULL) && (pidlFolder == NULL)) return E_FAIL; pThis->m_bIsSymlink=false; pThis->m_bIsMountpoint=false; pThis->m_bIsPathInAFS=false; pThis->m_bDirSelected=false; if (pdobj) { // Use the given IDataObject to get a list of filenames (CF_HDROP) hres = pdobj->GetData(&fmte, &medium); if (FAILED(hres)) { return E_FAIL; } int nNumFiles = DragQueryFile((HDROP)medium.hGlobal, 0xFFFFFFFF, NULL, 0); if (nNumFiles == 0) hres = E_FAIL; else { pThis->m_bDirSelected = FALSE; for (int ii = 0; ii < nNumFiles; ii++) { CString strFileName; // Get the size of the file name string int nNameLen = DragQueryFile((HDROP)medium.hGlobal, ii, 0, 0); // Make room for it in our string object LPTSTR pszFileNameBuf = strFileName.GetBuffer(nNameLen + 1); // +1 for the terminating NULL ASSERT(pszFileNameBuf); // Get the file name DragQueryFile((HDROP)medium.hGlobal, ii, pszFileNameBuf, nNameLen + 1); strFileName.ReleaseBuffer(); if (!IsPathInAfs(strFileName)) { pThis->m_astrFileNames.RemoveAll(); pThis->m_bIsPathInAFS=false; break; } else { pThis->m_bIsSymlink=pThis->m_bIsSymlink||IsSymlink(strFileName); pThis->m_bIsMountpoint=pThis->m_bIsMountpoint||IsMountPoint(strFileName); pThis->m_bIsPathInAFS=true; } if (IsADir(strFileName)) pThis->m_bDirSelected = TRUE; pThis->m_astrFileNames.Add(strFileName); } // Release the data ReleaseStgMedium(&medium); } } if ((pThis->m_astrFileNames.GetSize() == 0)&&(pidlFolder)) { // if there are no valid files selected, try the folder background IShellFolder *parentFolder = NULL; STRRET name; TCHAR * szDisplayName = NULL; hres = ::SHGetDesktopFolder(&parentFolder); if (FAILED(hres)) return hres; hres = parentFolder->GetDisplayNameOf(pidlFolder, SHGDN_NORMAL | SHGDN_FORPARSING, &name); if (FAILED(hres)) { parentFolder->Release(); return hres; } hres = StrRetToStr (&name, pidlFolder, &szDisplayName); if (FAILED(hres)) return hres; parentFolder->Release(); if (szDisplayName) { pThis->m_bDirSelected = TRUE; CString strFileName = CString(szDisplayName); if (IsPathInAfs(strFileName)) { pThis->m_bIsSymlink=IsSymlink(strFileName); pThis->m_bIsMountpoint=IsMountPoint(strFileName); pThis->m_bIsPathInAFS=true; pThis->m_astrFileNames.Add(strFileName); } CoTaskMemFree(szDisplayName); } } if (pThis->m_astrFileNames.GetSize() > 0) hres = NOERROR; else hres = E_FAIL; return hres; }
HRESULT CMenuSFToolbar::FillToolbar(BOOL clearFirst) { HRESULT hr; CComPtr<IEnumIDList> eidl; hr = m_shellFolder->EnumObjects(GetToolbar(), SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &eidl); if (FAILED_UNEXPECTEDLY(hr)) return hr; HDPA dpaSort = DPA_Create(10); LPITEMIDLIST item = NULL; hr = eidl->Next(1, &item, NULL); while (hr == S_OK) { if (m_menuBand->_CallCBWithItemPidl(item, 0x10000000, 0, 0) == S_FALSE) { DPA_AppendPtr(dpaSort, ILClone(item)); } hr = eidl->Next(1, &item, NULL); } // If no items were added, show the "empty" placeholder if (DPA_GetPtrCount(dpaSort) == 0) { DPA_Destroy(dpaSort); return AddPlaceholder(); } TRACE("FillToolbar added %d items to the DPA\n", DPA_GetPtrCount(dpaSort)); DPA_Sort(dpaSort, PidlListSort, (LPARAM) m_shellFolder.p); for (int i = 0; i<DPA_GetPtrCount(dpaSort);) { PWSTR MenuString; INT index = 0; INT indexOpen = 0; STRRET sr = { STRRET_CSTR, { 0 } }; item = (LPITEMIDLIST)DPA_GetPtr(dpaSort, i); hr = m_shellFolder->GetDisplayNameOf(item, SIGDN_NORMALDISPLAY, &sr); if (FAILED_UNEXPECTEDLY(hr)) { DPA_Destroy(dpaSort); return hr; } StrRetToStr(&sr, NULL, &MenuString); index = SHMapPIDLToSystemImageListIndex(m_shellFolder, item, &indexOpen); LPCITEMIDLIST itemc = item; SFGAOF attrs = SFGAO_FOLDER; hr = m_shellFolder->GetAttributesOf(1, &itemc, &attrs); DWORD_PTR dwData = reinterpret_cast<DWORD_PTR>(item); // Fetch next item already, so we know if the current one is the last i++; AddButton(i, MenuString, attrs & SFGAO_FOLDER, index, dwData, i >= DPA_GetPtrCount(dpaSort)); CoTaskMemFree(MenuString); } DPA_Destroy(dpaSort); return hr; }
BOOL CPropertiesCtrl::OnExpanding( HTREEITEM hItem, UINT nCode ) { int i, nChild = 0; CFTCItemData * pItemData = (CFTCItemData*)GetItemData( hItem ); switch( nCode ) { case TVE_EXPAND: { CWaitCursor cur; nChild = GetChildCount( hItem ); for( i = 0; i < nChild; i++ ) { DelItemRecursive( GetNextItem( hItem, TVGN_CHILD ) ); Invalidate(); } CComPtr<IEnumIDList> piIDList; ULONG nRes = 0; ITEMIDLIST * pItem = NULL; HRESULT hr = pItemData->m_piFolder->EnumObjects( NULL, SHCONTF_FOLDERS, &piIDList ); _STRRET strret; CSCADString sPath, sName; IExtractIcon * piEI = NULL; IShellFolder * piChildFolder = NULL; if( hr != NOERROR ) { Invalidate(); return FALSE; } for( hr = piIDList->Next( 1, &pItem, &nRes ); hr == NOERROR && nRes > 0; hr = piIDList->Next( 1, &pItem, &nRes ) ) { hr = pItemData->m_piFolder->GetDisplayNameOf( pItem, SHGDN_INFOLDER, &strret ); sName = StrRetToStr(pItem, strret, true, m_piMalloc ); hr = pItemData->m_piFolder->GetDisplayNameOf( pItem, SHGDN_NORMAL | SHGDN_FORPARSING, &strret ); sPath = StrRetToStr(pItem, strret, true, m_piMalloc ); hr = pItemData->m_piFolder->GetUIObjectOf( NULL, 1, (LPCITEMIDLIST*)&pItem, IID_IExtractIcon, NULL, (void**)&piEI ); hr = pItemData->m_piFolder->BindToObject( pItem, NULL, IID_IShellFolder, (void**)&piChildFolder ); if( piChildFolder ) { if( !piEI ) { //hr = piChildFolder->CreateViewObject( NULL, IID_IExtractIcon, (void**)&piEI ); } //InsertFolder( pItem, piChildFolder, piEI, sName, sPath, hItem ); piChildFolder->Release(); piChildFolder = NULL; } if( piEI ) { piEI->Release(); piEI = NULL; } } } return TRUE; default: nChild = GetChildCount( hItem ); for( i = 0; i < nChild; i++ ) DelItemRecursive( GetNextItem( hItem, TVGN_CHILD ) ); if( !IsFolderEmpty( pItemData->m_piFolder ) ) InsertItem( _T(""), hItem, TVI_LAST ); break; } return TRUE; }