/* TODO: Will have to change this. If AddItem() fails for some reason, then add the item to the tracking list. */ void CMyTreeView::DirectoryAlteredAddFile(const TCHAR *szFullFileName) { LPITEMIDLIST pidlComplete = NULL; HRESULT hr; /* We'll use this as a litmus test to check whether or not the file actually exists. */ hr = GetIdlFromParsingName(szFullFileName,&pidlComplete); if(SUCCEEDED(hr)) { AddItem(szFullFileName); CoTaskMemFree(pidlComplete); } else { /* The file doesn't exist, so keep a record of it. */ AlteredFile_t af; StringCchCopy(af.szFileName,SIZEOF_ARRAY(af.szFileName),szFullFileName); af.dwAction = FILE_ACTION_ADDED; m_AlteredTrackingList.push_back(af); } }
HRESULT Explorerplusplus::CreateNewTab(TCHAR *TabDirectory, InitialSettings_t *pSettings,TabInfo_t *pTabInfo,BOOL bSwitchToNewTab, int *pTabObjectIndex) { LPITEMIDLIST pidl = NULL; TCHAR szExpandedPath[MAX_PATH]; HRESULT hr; BOOL bRet; /* Attempt to expand the path (in the event that it contains embedded environment variables). */ bRet = MyExpandEnvironmentStrings(TabDirectory, szExpandedPath,SIZEOF_ARRAY(szExpandedPath)); if(!bRet) { StringCchCopy(szExpandedPath, SIZEOF_ARRAY(szExpandedPath),TabDirectory); } if(!SUCCEEDED(GetIdlFromParsingName(szExpandedPath,&pidl))) return E_FAIL; hr = CreateNewTab(pidl,pSettings,pTabInfo,bSwitchToNewTab,pTabObjectIndex); CoTaskMemFree(pidl); return hr; }
/* TODO: These groups have changed as of Windows Vista. */ void CShellBrowser::DetermineItemTotalSizeGroup(int iItemInternal,TCHAR *szGroupHeader,int cchMax) const { IShellFolder *pShellFolder = NULL; LPITEMIDLIST pidlComplete = NULL; LPITEMIDLIST pidlDirectory = NULL; LPITEMIDLIST pidlRelative = NULL; TCHAR *SizeGroups[] = {_T("Unspecified"),_T("Small"),_T("Medium"),_T("Huge"),_T("Gigantic")}; TCHAR szItem[MAX_PATH]; STRRET str; ULARGE_INTEGER nTotalBytes; ULARGE_INTEGER nFreeBytes; BOOL bRoot; BOOL bRes = FALSE; ULARGE_INTEGER TotalSizeGroupLimits[6]; int nGroups = 5; int iSize = 0; int i; TotalSizeGroupLimits[0].QuadPart = 0; TotalSizeGroupLimits[1].QuadPart = 0; TotalSizeGroupLimits[2].QuadPart = GBYTE; TotalSizeGroupLimits[3].QuadPart = 20 * TotalSizeGroupLimits[2].QuadPart; TotalSizeGroupLimits[4].QuadPart = 100 * TotalSizeGroupLimits[2].QuadPart; GetIdlFromParsingName(m_CurDir,&pidlDirectory); pidlComplete = ILCombine(pidlDirectory,m_pExtraItemInfo[iItemInternal].pridl); SHBindToParent(pidlComplete, IID_PPV_ARGS(&pShellFolder), (LPCITEMIDLIST *) &pidlRelative); pShellFolder->GetDisplayNameOf(pidlRelative,SHGDN_FORPARSING,&str); StrRetToBuf(&str,pidlRelative,szItem,SIZEOF_ARRAY(szItem)); bRoot = PathIsRoot(szItem); if(bRoot) { bRes = GetDiskFreeSpaceEx(szItem,NULL,&nTotalBytes,&nFreeBytes); CoTaskMemFree(pidlDirectory); CoTaskMemFree(pidlComplete); pShellFolder->Release(); i = nGroups - 1; while(nTotalBytes.QuadPart < TotalSizeGroupLimits[i].QuadPart && i > 0) i--; iSize = i; } if(!bRoot || !bRes) { iSize = 0; } StringCchCopy(szGroupHeader,cchMax,SizeGroups[iSize]); }
void CShellBrowser::BrowseVirtualFolder(TCHAR *szParsingName) { LPITEMIDLIST pidl = NULL; GetIdlFromParsingName(szParsingName,&pidl); BrowseVirtualFolder(pidl); CoTaskMemFree(pidl); }
void TestIsIdlDirectory(const TCHAR *szFullFileName, BOOL bExpected) { LPITEMIDLIST pidl = NULL; HRESULT hr = GetIdlFromParsingName(szFullFileName, &pidl); ASSERT_TRUE(SUCCEEDED(hr)); BOOL bRet = IsIdlDirectory(pidl); EXPECT_EQ(bExpected, bRet); CoTaskMemFree(pidl); }
/* TODO: Need to sort based on percentage free. */ void CShellBrowser::DetermineItemFreeSpaceGroup(int iItemInternal,TCHAR *szGroupHeader,int cchMax) const { std::list<TypeGroup_t>::iterator itr; LPITEMIDLIST pidlComplete = NULL; LPITEMIDLIST pidlDirectory = NULL; TCHAR szFreeSpace[MAX_PATH]; IShellFolder *pShellFolder = NULL; LPITEMIDLIST pidlRelative = NULL; STRRET str; TCHAR szItem[MAX_PATH]; ULARGE_INTEGER nTotalBytes; ULARGE_INTEGER nFreeBytes; BOOL bRoot; BOOL bRes = FALSE; GetIdlFromParsingName(m_CurDir,&pidlDirectory); pidlComplete = ILCombine(pidlDirectory,m_pExtraItemInfo[iItemInternal].pridl); SHBindToParent(pidlComplete, IID_PPV_ARGS(&pShellFolder), (LPCITEMIDLIST *)&pidlRelative); pShellFolder->GetDisplayNameOf(pidlRelative,SHGDN_FORPARSING,&str); StrRetToBuf(&str,pidlRelative,szItem,SIZEOF_ARRAY(szItem)); CoTaskMemFree(pidlDirectory); CoTaskMemFree(pidlComplete); pShellFolder->Release(); bRoot = PathIsRoot(szItem); if(bRoot) { bRes = GetDiskFreeSpaceEx(szItem,NULL,&nTotalBytes,&nFreeBytes); LARGE_INTEGER lDiv1; LARGE_INTEGER lDiv2; lDiv1.QuadPart = 100; lDiv2.QuadPart = 10; /* Divide by 10 to remove the one's digit, then multiply by 10 so that only the ten's digit rmains. */ StringCchPrintf(szFreeSpace,SIZEOF_ARRAY(szFreeSpace), _T("%I64d%% free"),(((nFreeBytes.QuadPart * lDiv1.QuadPart) / nTotalBytes.QuadPart) / lDiv2.QuadPart) * lDiv2.QuadPart); } if(!bRoot || !bRes) { StringCchCopy(szFreeSpace,SIZEOF_ARRAY(szFreeSpace),_T("Unspecified")); } StringCchCopy(szGroupHeader,cchMax,szFreeSpace); }
HRESULT CShellBrowser::BrowseFolder(const TCHAR *szPath,UINT wFlags) { LPITEMIDLIST pidlDirectory = NULL; HRESULT hr = GetIdlFromParsingName(szPath,&pidlDirectory); if(SUCCEEDED(hr)) { hr = BrowseFolder(pidlDirectory,wFlags); CoTaskMemFree(pidlDirectory); } return hr; }
BOOL CheckIdl(LPCITEMIDLIST pidl) { LPITEMIDLIST pidlCheck = NULL; TCHAR szTabText[MAX_PATH]; if(!SUCCEEDED(GetDisplayName(pidl,szTabText,SIZEOF_ARRAY(szTabText),SHGDN_FORPARSING))) return FALSE; if(!SUCCEEDED(GetIdlFromParsingName(szTabText,&pidlCheck))) return FALSE; CoTaskMemFree(pidlCheck); return TRUE; }
/* Renames an item in the treeview. This essentially involves changing the items display text, and updating it's pidl. Note that the children of this item MUST ALL BE UPDATED as well, since their pidl's will also change. */ void CMyTreeView::RenameItem(HTREEITEM hItem, const TCHAR *szFullFileName) { TVITEMEX tvItem; ItemInfo_t *pItemInfo = NULL; LPITEMIDLIST pidlParent; SHFILEINFO shfi; TCHAR szFileName[MAX_PATH]; HRESULT hr; BOOL res; if(hItem == NULL) return; tvItem.mask = TVIF_PARAM; tvItem.hItem = hItem; res = TreeView_GetItem(m_hTreeView,&tvItem); if(res) { pItemInfo = &m_pItemInfo[(int)tvItem.lParam]; CoTaskMemFree(pItemInfo->pidl); StringCchCopy(szFileName, SIZEOF_ARRAY(szFileName), szFullFileName); PathStripPath(szFileName); hr = GetIdlFromParsingName(szFullFileName,&pItemInfo->pidl); pidlParent = pItemInfo->pidl; if(SUCCEEDED(hr)) { SHGetFileInfo(szFullFileName,NULL,&shfi,sizeof(shfi),SHGFI_SYSICONINDEX); tvItem.mask = TVIF_HANDLE|TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; tvItem.hItem = hItem; tvItem.pszText = szFileName; tvItem.iImage = shfi.iIcon; tvItem.iSelectedImage = shfi.iIcon; TreeView_SetItem(m_hTreeView,&tvItem); /* Now recursively go through each of this items children and update their pidl's. */ UpdateChildren(hItem,pidlParent); } } }
void CDropHandler::HandleRightClickDrop(void) { IShellFolder *pDesktop = NULL; IShellFolder *pShellFolder = NULL; IDropTarget *pDrop = NULL; LPITEMIDLIST pidlDirectory = NULL; DWORD dwe; HRESULT hr; hr = GetIdlFromParsingName(m_szDestDirectory,&pidlDirectory); if(SUCCEEDED(hr)) { hr = SHGetDesktopFolder(&pDesktop); if(SUCCEEDED(hr)) { hr = pDesktop->BindToObject(pidlDirectory,0,IID_IShellFolder,(void **)&pShellFolder); if(SUCCEEDED(hr)) { dwe = *m_pdwEffect; hr = pShellFolder->CreateViewObject(m_hwndDrop,IID_IDropTarget,(void **)&pDrop); if(SUCCEEDED(hr)) { pDrop->DragEnter(m_pDataObject,MK_RBUTTON,m_ptl,&dwe); dwe = *m_pdwEffect; pDrop->Drop(m_pDataObject,m_grfKeyState,m_ptl,&dwe); pDrop->DragLeave(); pDrop->Release(); } pShellFolder->Release(); } pDesktop->Release(); } CoTaskMemFree(pidlDirectory); } }
void CShellBrowser::DetermineItemTypeGroupVirtual(int iItemInternal,TCHAR *szGroupHeader,int cchMax) const { LPITEMIDLIST pidlComplete = NULL; LPITEMIDLIST pidlDirectory = NULL; SHFILEINFO shfi; std::list<TypeGroup_t>::iterator itr; GetIdlFromParsingName(m_CurDir,&pidlDirectory); pidlComplete = ILCombine(pidlDirectory,m_pExtraItemInfo[iItemInternal].pridl); SHGetFileInfo((LPTSTR)pidlComplete,0,&shfi,sizeof(shfi),SHGFI_PIDL|SHGFI_TYPENAME); StringCchCopy(szGroupHeader,cchMax,shfi.szTypeName); CoTaskMemFree(pidlComplete); CoTaskMemFree(pidlDirectory); }
HRESULT GetDisplayName(const TCHAR *szParsingPath,TCHAR *szDisplayName,UINT cchMax,DWORD uFlags) { if(szParsingPath == NULL || szDisplayName == NULL) { return E_FAIL; } LPITEMIDLIST pidl = NULL; HRESULT hr; hr = GetIdlFromParsingName(szParsingPath,&pidl); if(SUCCEEDED(hr)) { hr = GetDisplayName(pidl,szDisplayName,cchMax,uFlags); CoTaskMemFree(pidl); } return hr; }
HRESULT GetItemAttributes(const TCHAR *szItemParsingPath,SFGAOF *pItemAttributes) { if(szItemParsingPath == NULL || pItemAttributes == NULL) { return E_FAIL; } LPITEMIDLIST pidl = NULL; HRESULT hr; hr = GetIdlFromParsingName(szItemParsingPath,&pidl); if(SUCCEEDED(hr)) { hr = GetItemAttributes(pidl,pItemAttributes); CoTaskMemFree(pidl); } return hr; }
void TestGetShellItemDetailsEx(TCHAR *szFileName, const SHCOLUMNID *pscid, const TCHAR *szDetailExpected) { TCHAR szResourceDirectory[MAX_PATH]; GetTestResourceDirectory(szResourceDirectory, SIZEOF_ARRAY(szResourceDirectory)); LPITEMIDLIST pidlResourceDirectory; HRESULT hr = GetIdlFromParsingName(szResourceDirectory, &pidlResourceDirectory); ASSERT_TRUE(SUCCEEDED(hr)); IShellFolder2 *pShellFolder = NULL; hr = BindToIdl(pidlResourceDirectory, IID_PPV_ARGS(&pShellFolder)); ASSERT_TRUE(SUCCEEDED(hr)); LPITEMIDLIST pidlItem = NULL; hr = pShellFolder->ParseDisplayName(NULL, NULL, szFileName, NULL, &pidlItem, NULL); ASSERT_TRUE(SUCCEEDED(hr)); TCHAR szDetail[512]; hr = GetShellItemDetailsEx(pShellFolder, pscid, pidlItem, szDetail, SIZEOF_ARRAY(szDetail)); CoTaskMemFree(pidlItem); ASSERT_TRUE(SUCCEEDED(hr)); EXPECT_STREQ(szDetailExpected, szDetail); }
void CMyTreeView::AddItemInternal(HTREEITEM hParent,const TCHAR *szFullFileName) { IShellFolder *pShellFolder = NULL; LPITEMIDLIST pidlComplete = NULL; LPITEMIDLIST pidlRelative = NULL; HTREEITEM hItem; TVITEMEX tvItem; TVINSERTSTRUCT tvis; SHFILEINFO shfi; SFGAOF Attributes; TCHAR szDisplayName[MAX_PATH]; HRESULT hr; BOOL res; int iItemId; int nChildren = 0; hr = GetIdlFromParsingName(szFullFileName,&pidlComplete); if(!SUCCEEDED(hr)) return; tvItem.mask = TVIF_CHILDREN | TVIF_STATE; tvItem.hItem = hParent; res = TreeView_GetItem(m_hTreeView,&tvItem); if(res) { /* If the parent node is currently collapsed, simply indicate that it has children (i.e. a plus sign will be shown next to the parent node). */ if((tvItem.cChildren == 0) || ((tvItem.state & TVIS_EXPANDED) != TVIS_EXPANDED)) { tvItem.mask = TVIF_CHILDREN; tvItem.hItem = hParent; tvItem.cChildren = 1; TreeView_SetItem(m_hTreeView,&tvItem); } else { SHGetFileInfo(szFullFileName,NULL,&shfi, sizeof(shfi),SHGFI_SYSICONINDEX); hr = SHBindToParent(pidlComplete, IID_PPV_ARGS(&pShellFolder), (LPCITEMIDLIST *)&pidlRelative); if(SUCCEEDED(hr)) { Attributes = SFGAO_HASSUBFOLDER; /* Only retrieve the attributes for this item. */ hr = pShellFolder->GetAttributesOf(1, (LPCITEMIDLIST *)&pidlRelative,&Attributes); if(SUCCEEDED(hr)) { if((Attributes & SFGAO_HASSUBFOLDER) != SFGAO_HASSUBFOLDER) nChildren = 0; else nChildren = 1; iItemId = GenerateUniqueItemId(); m_pItemInfo[iItemId].pidl = ILClone(pidlComplete); m_pItemInfo[iItemId].pridl = ILClone(pidlRelative); GetDisplayName(szFullFileName,szDisplayName,SIZEOF_ARRAY(szDisplayName),SHGDN_NORMAL); tvItem.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM|TVIF_CHILDREN; tvItem.pszText = szDisplayName; tvItem.iImage = shfi.iIcon; tvItem.iSelectedImage = shfi.iIcon; tvItem.lParam = (LPARAM)iItemId; tvItem.cChildren = nChildren; if(hParent != NULL) { tvis.hParent = hParent; tvis.hInsertAfter = DetermineItemSortedPosition(hParent,szFullFileName); tvis.itemex = tvItem; hItem = TreeView_InsertItem(m_hTreeView,&tvis); } } pShellFolder->Release(); } } } CoTaskMemFree(pidlComplete); }
void CDisplayWindow::ExtractThumbnailImageInternal(ThumbnailEntry_t *pte) { IExtractImage *pExtractImage = NULL; IShellFolder *pShellFolder = NULL; LPITEMIDLIST pidlParent = NULL; LPITEMIDLIST pidlFull = NULL; LPITEMIDLIST pridl = NULL; HBITMAP hBitmap; BITMAP bm; RECT rc; SIZE size; TCHAR szImage[MAX_PATH]; DWORD dwPriority; DWORD dwFlags; HRESULT hr; m_bThumbnailExtracted = TRUE; m_bThumbnailExtractionFailed = TRUE; hr = GetIdlFromParsingName(m_ImageFile,&pidlFull); if(SUCCEEDED(hr)) { pidlParent = ILClone(pidlFull); ILRemoveLastID(pidlParent); pridl = ILClone(ILFindLastID(pidlFull)); hr = BindToIdl(pidlParent, IID_PPV_ARGS(&pShellFolder)); if(SUCCEEDED(hr)) { hr = GetUIObjectOf(pShellFolder, NULL, 1, (LPCITEMIDLIST *) &pridl, IID_PPV_ARGS(&pExtractImage)); if(SUCCEEDED(hr)) { GetClientRect(m_hDisplayWindow,&rc); /* First, query the thumbnail so that its actual aspect ratio can be calculated. */ dwFlags = IEIFLAG_OFFLINE|IEIFLAG_QUALITY|IEIFLAG_ORIGSIZE; size.cx = GetRectHeight(&rc) - THUMB_HEIGHT_DELTA; size.cy = GetRectHeight(&rc) - THUMB_HEIGHT_DELTA; hr = pExtractImage->GetLocation(szImage,SIZEOF_ARRAY(szImage), &dwPriority,&size,32,&dwFlags); if(SUCCEEDED(hr)) { hr = pExtractImage->Extract(&hBitmap); if(SUCCEEDED(hr)) { /* Get bitmap information (including height and width). */ GetObject(hBitmap,sizeof(BITMAP),&bm); /* Delete the original bitmap. */ DeleteObject(hBitmap); /* ...now query the thumbnail again, this time adjusting the width of the suggested area based on the actual aspect ratio. */ dwFlags = IEIFLAG_OFFLINE|IEIFLAG_QUALITY|IEIFLAG_ASPECT|IEIFLAG_ORIGSIZE; size.cy = GetRectHeight(&rc) - THUMB_HEIGHT_DELTA; size.cx = (LONG)((double)size.cy * ((double)bm.bmWidth / (double)bm.bmHeight)); m_iImageWidth = size.cx; m_iImageHeight = size.cy; pExtractImage->GetLocation(szImage,SIZEOF_ARRAY(szImage), &dwPriority,&size,32,&dwFlags); hr = pExtractImage->Extract(&m_hbmThumbnail); if(SUCCEEDED(hr)) { /* Check first if we've been cancelled. This might happen, for example, if another file is selected while the current thumbnail is been found. */ EnterCriticalSection(&m_csDWThumbnails); if(!pte->bCancelled) { m_bThumbnailExtractionFailed = FALSE; InvalidateRect(m_hDisplayWindow,NULL,FALSE); } LeaveCriticalSection(&m_csDWThumbnails); } else { m_bThumbnailExtractionFailed = TRUE; m_hbmThumbnail = NULL; } } } pExtractImage->Release(); } pShellFolder->Release(); } CoTaskMemFree(pidlFull); CoTaskMemFree(pidlParent); CoTaskMemFree(pridl); } }
void CShellBrowser::OnFileActionAdded(const TCHAR *szFileName) { IShellFolder *pShellFolder = NULL; LPITEMIDLIST pidlFull = NULL; LPITEMIDLIST pidlRelative = NULL; Added_t Added; TCHAR FullFileName[MAX_PATH]; TCHAR szDisplayName[MAX_PATH]; STRRET str; BOOL bFileAdded = FALSE; HRESULT hr; StringCchCopy(FullFileName,SIZEOF_ARRAY(FullFileName),m_CurDir); PathAppend(FullFileName,szFileName); hr = GetIdlFromParsingName(FullFileName,&pidlFull); /* It is possible that by the time a file is registered here, it will have already been renamed. In this the following check will fail. If the file is not added, store its filename. */ if(SUCCEEDED(hr)) { hr = SHBindToParent(pidlFull, IID_PPV_ARGS(&pShellFolder), (LPCITEMIDLIST *)&pidlRelative); if(SUCCEEDED(hr)) { /* If this is a virtual folder, only use SHGDN_INFOLDER. If this is a real folder, combine SHGDN_INFOLDER with SHGDN_FORPARSING. This is so that items in real folders can still be shown with extensions, even if the global, Explorer option is disabled. */ if(m_bVirtualFolder) hr = pShellFolder->GetDisplayNameOf(pidlRelative,SHGDN_INFOLDER,&str); else hr = pShellFolder->GetDisplayNameOf(pidlRelative,SHGDN_INFOLDER|SHGDN_FORPARSING,&str); if(SUCCEEDED(hr)) { StrRetToBuf(&str,pidlRelative,szDisplayName,SIZEOF_ARRAY(szDisplayName)); std::list<DroppedFile_t>::iterator itr; BOOL bDropped = FALSE; if(!m_DroppedFileNameList.empty()) { for(itr = m_DroppedFileNameList.begin();itr != m_DroppedFileNameList.end();itr++) { if(lstrcmp(szDisplayName,itr->szFileName) == 0) { bDropped = TRUE; break; } } } /* Only insert the item in its sorted position if it wasn't dropped in. */ if(m_bInsertSorted && !bDropped) { int iItemId; int iSorted; iItemId = SetItemInformation(m_pidlDirectory,pidlRelative,szDisplayName); iSorted = DetermineItemSortedPosition(iItemId); AddItemInternal(iSorted,iItemId,TRUE); } else { /* Just add the item to the end of the list. */ AddItemInternal(m_pidlDirectory,pidlRelative,szDisplayName,-1,FALSE); } InsertAwaitingItems(m_bShowInGroups); bFileAdded = TRUE; } pShellFolder->Release(); } CoTaskMemFree(pidlFull); } if(!bFileAdded) { /* The file does not exist. However, it is possible that is was simply renamed shortly after been created. Record the filename temporarily (so that it can later be added). */ StringCchCopy(Added.szFileName,SIZEOF_ARRAY(Added.szFileName),szFileName); m_FilesAdded.push_back(Added); } }
/* TODO: This code should be coalesced with the code that adds items as well as the code that finds their icons. ALL changes to an items name/internal properties/icon/overlay icon should go through a central function. */ void CFolderView::RenameItem(int iItemInternal,TCHAR *szNewFileName) { IShellFolder *pShellFolder = NULL; LPITEMIDLIST pidlFull = NULL; LPITEMIDLIST pidlRelative = NULL; SHFILEINFO shfi; LVFINDINFO lvfi; TCHAR szDisplayName[MAX_PATH]; LVITEM lvItem; TCHAR szFullFileName[MAX_PATH]; DWORD_PTR res; HRESULT hr; int iItem; if(iItemInternal == -1) return; StringCchCopy(szFullFileName,MAX_PATH,m_CurDir); PathAppend(szFullFileName,szNewFileName); hr = GetIdlFromParsingName(szFullFileName,&pidlFull); if(SUCCEEDED(hr)) { hr = SHBindToParent(pidlFull,IID_IShellFolder,(void **)&pShellFolder,(LPCITEMIDLIST *)&pidlRelative); if(SUCCEEDED(hr)) { hr = GetDisplayName(szFullFileName,szDisplayName,SHGDN_INFOLDER|SHGDN_FORPARSING); if(SUCCEEDED(hr)) { m_pExtraItemInfo[iItemInternal].pridl = ILClone(pidlRelative); StringCchCopy(m_pExtraItemInfo[iItemInternal].szDisplayName, SIZEOF_ARRAY(m_pExtraItemInfo[iItemInternal].szDisplayName), szDisplayName); /* Need to update internal storage for the item, since it's name has now changed. */ StringCchCopy(m_pwfdFiles[iItemInternal].cFileName, SIZEOF_ARRAY(m_pwfdFiles[iItemInternal].cFileName), szNewFileName); /* The files' type may have changed, so retrieve the files' icon again. */ res = SHGetFileInfo((LPTSTR)pidlFull,0,&shfi, sizeof(SHFILEINFO),SHGFI_PIDL|SHGFI_ICON| SHGFI_OVERLAYINDEX); if(res != 0) { /* Locate the item within the listview. */ lvfi.flags = LVFI_PARAM; lvfi.lParam = iItemInternal; iItem = ListView_FindItem(m_hListView,-1,&lvfi); if(iItem != -1) { lvItem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_STATE; lvItem.iItem = iItem; lvItem.iSubItem = 0; lvItem.iImage = shfi.iIcon; lvItem.pszText = ProcessItemFileName(iItemInternal); lvItem.stateMask = LVIS_OVERLAYMASK; /* As well as resetting the items icon, we'll also set it's overlay again (the overlay could change, for example, if the file is changed to a shortcut). */ lvItem.state = INDEXTOOVERLAYMASK(shfi.iIcon >> 24); /* Update the item in the listview. */ ListView_SetItem(m_hListView,&lvItem); /* TODO: Does the file need to be filtered out? */ if(IsFileFiltered(iItemInternal)) { RemoveFilteredItem(iItem,iItemInternal); } } DestroyIcon(shfi.hIcon); } } pShellFolder->Release(); }