DWORD Network::GetComputerNameFromIDList(LPITEMIDLIST lpiil,LPSTR szName,DWORD dwBufferLen) { // May be computer? IShellFolder *psf; if (!SUCCEEDED(SHGetDesktopFolder(&psf))) return 0; SHDESCRIPTIONID di; if (!SUCCEEDED(SHGetDataFromIDList(psf,lpiil,SHGDFIL_DESCRIPTIONID,&di,sizeof(SHDESCRIPTIONID)))) { psf->Release(); return 0; } if (di.clsid!=CLSID_NetworkPlaces) { psf->Release(); return 0; } STRRET str; if (!SUCCEEDED(psf->GetDisplayNameOf(lpiil,SHGDN_FORPARSING,&str))) { psf->Release(); return 0; } psf->Release(); if (ShellFunctions::StrRetToStr(str,lpiil,szName,dwBufferLen)) return istrlen(szName); return 0; }
// Retrieves extended infomration on a dirlist item int DirList_GetItemEx(HWND hwnd, int iItem, LPWIN32_FIND_DATA pfd) { LV_ITEM lvi; LPLV_ITEMDATA lplvid; if (iItem == -1) { if (ListView_GetSelectedCount(hwnd)) iItem = ListView_GetNextItem(hwnd, -1, LVNI_ALL | LVNI_SELECTED); else return (-1); } lvi.mask = LVIF_PARAM; lvi.iItem = iItem; lvi.iSubItem = 0; if (!ListView_GetItem(hwnd, &lvi)) return (-1); lplvid = (LPLV_ITEMDATA)lvi.lParam; if (NOERROR == SHGetDataFromIDList(lplvid->lpsf, lplvid->pidl, SHGDFIL_FINDDATA, pfd, sizeof(WIN32_FIND_DATA))) return iItem; else return (-1); }
void ShellDirectory::fill_w32fdata_shell(LPCITEMIDLIST pidl, SFGAOF attribs, WIN32_FIND_DATA* pw32fdata, bool do_access) { CONTEXT("ShellDirectory::fill_w32fdata_shell()"); if (do_access && !( (attribs&SFGAO_FILESYSTEM) && SUCCEEDED( SHGetDataFromIDList(_folder, pidl, SHGDFIL_FINDDATA, pw32fdata, sizeof(WIN32_FIND_DATA))) )) { WIN32_FILE_ATTRIBUTE_DATA fad; IDataObject* pDataObj; STGMEDIUM medium = {0, {0}, 0}; FORMATETC fmt = {g_Globals._cfStrFName, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; HRESULT hr = _folder->GetUIObjectOf(0, 1, &pidl, IID_IDataObject, 0, (LPVOID*)&pDataObj); if (SUCCEEDED(hr)) { hr = pDataObj->GetData(&fmt, &medium); pDataObj->Release(); if (SUCCEEDED(hr)) { LPCTSTR path = (LPCTSTR)GlobalLock(medium.hGlobal); // fill with drive names "C:", ... assert(_tcslen(path) < GlobalSize(medium.hGlobal)); _tcscpy(pw32fdata->cFileName, path); UINT sem_org = SetErrorMode(SEM_FAILCRITICALERRORS); if (GetFileAttributesEx(path, GetFileExInfoStandard, &fad)) { pw32fdata->dwFileAttributes = fad.dwFileAttributes; pw32fdata->ftCreationTime = fad.ftCreationTime; pw32fdata->ftLastAccessTime = fad.ftLastAccessTime; pw32fdata->ftLastWriteTime = fad.ftLastWriteTime; if (!(fad.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { pw32fdata->nFileSizeLow = fad.nFileSizeLow; pw32fdata->nFileSizeHigh = fad.nFileSizeHigh; } } SetErrorMode(sem_org); GlobalUnlock(medium.hGlobal); GlobalFree(medium.hGlobal); } } } if (!do_access || !(attribs&SFGAO_FILESYSTEM)) // Archiv files should not be displayed as folders in explorer view. if (attribs & (SFGAO_FOLDER|SFGAO_HASSUBFOLDER)) pw32fdata->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; if (attribs & SFGAO_READONLY) pw32fdata->dwFileAttributes |= FILE_ATTRIBUTE_READONLY; if (attribs & SFGAO_COMPRESSED) pw32fdata->dwFileAttributes |= FILE_ATTRIBUTE_COMPRESSED; }
//============================================================================= // // DirList_MatchFilter() // // Check if a specified item matches a given filter // BOOL DirList_MatchFilter(LPSHELLFOLDER lpsf,LPCITEMIDLIST pidl,PDL_FILTER pdlf) { int i; WIN32_FIND_DATA fd; BOOL bMatchSpec; // Immediately return true if lpszFileSpec is *.* or NULL if (pdlf->nCount == 0 && !pdlf->bExcludeFilter) return TRUE; SHGetDataFromIDList(lpsf,pidl,SHGDFIL_FINDDATA,&fd,sizeof(WIN32_FIND_DATA)); // All the directories are added if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) return(TRUE); // Check if exclude *.* after directories have been added if (pdlf->nCount == 0 && pdlf->bExcludeFilter) return FALSE; for (i = 0; i < pdlf->nCount; i++) { if (*pdlf->pFilter[i]) // Filters like L"\0" are ignored { bMatchSpec = PathMatchSpec(fd.cFileName,pdlf->pFilter[i]); if (bMatchSpec) { if (!pdlf->bExcludeFilter) return(TRUE); else return(FALSE); } } } // No matching return(pdlf->bExcludeFilter)?TRUE:FALSE; }
//============================================================================= // // DirList_GetItem() // // Copies the data of the specified item in the listview control to a buffer // int DirList_GetItem(HWND hwnd,int iItem,LPDLITEM lpdli) { LV_ITEM lvi; LPLV_ITEMDATA lplvid; ULONG dwAttributes = SFGAO_FILESYSTEM; if (iItem == -1) { if (ListView_GetSelectedCount(hwnd)) iItem = ListView_GetNextItem(hwnd,-1,LVNI_ALL | LVNI_SELECTED); else return(-1); } lvi.mask = LVIF_PARAM; lvi.iItem = iItem; lvi.iSubItem = 0; if (!ListView_GetItem(hwnd,&lvi)) { if (lpdli->mask & DLI_TYPE) lpdli->ntype = DLE_NONE; return(-1); } lplvid = (LPLV_ITEMDATA)lvi.lParam; // Filename if (lpdli->mask & DLI_FILENAME) IL_GetDisplayName(lplvid->lpsf,lplvid->pidl,SHGDN_FORPARSING, lpdli->szFileName,MAX_PATH); // Displayname if (lpdli->mask & DLI_DISPNAME) IL_GetDisplayName(lplvid->lpsf,lplvid->pidl,SHGDN_INFOLDER, lpdli->szDisplayName,MAX_PATH); // Type (File / Directory) if (lpdli->mask & DLI_TYPE) { WIN32_FIND_DATA fd; if (NOERROR == SHGetDataFromIDList(lplvid->lpsf, lplvid->pidl, SHGDFIL_FINDDATA, &fd, sizeof(WIN32_FIND_DATA))) lpdli->ntype = (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? DLE_DIR : DLE_FILE; /*lplvid->lpsf->lpVtbl->GetAttributesOf( lplvid->lpsf, 1, &lplvid->pidl, &dwAttributes); lpdli->ntype = (dwAttributes & SFGAO_FOLDER) ? DLE_DIR : DLE_FILE;*/ } return iItem; }
//============================================================================= // // DirList_IconThread() // // Thread to extract file icons in the background // DWORD WINAPI DirList_IconThread(LPVOID lpParam) { HWND hwnd; LPDLDATA lpdl; LV_ITEM lvi; LPLV_ITEMDATA lplvid; IShellIcon* lpshi; int iItem = 0; int iMaxItem; lpdl = (LPDLDATA)lpParam; ResetEvent(lpdl->hTerminatedThread); // Exit immediately if DirList_Fill() hasn't been called if (!lpdl->lpsf) { SetEvent(lpdl->hTerminatedThread); ExitThread(0); return(0); } hwnd = lpdl->hwnd; iMaxItem = ListView_GetItemCount(hwnd); CoInitialize(NULL); // Get IShellIcon lpdl->lpsf->lpVtbl->QueryInterface(lpdl->lpsf,&IID_IShellIcon,&lpshi); while (iItem < iMaxItem && WaitForSingleObject(lpdl->hExitThread,0) != WAIT_OBJECT_0) { lvi.iItem = iItem; lvi.mask = LVIF_PARAM; if (ListView_GetItem(hwnd,&lvi)) { SHFILEINFO shfi; LPITEMIDLIST pidl; DWORD dwAttributes = SFGAO_LINK | SFGAO_SHARE; lplvid = (LPLV_ITEMDATA)lvi.lParam; lvi.mask = LVIF_IMAGE; if (!lpshi || NOERROR != lpshi->lpVtbl->GetIconOf(lpshi,lplvid->pidl,GIL_FORSHELL,&lvi.iImage)) { pidl = IL_Create(lpdl->pidl,lpdl->cbidl,lplvid->pidl,0); SHGetFileInfo((LPCWSTR)pidl,0,&shfi,sizeof(SHFILEINFO),SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON); CoTaskMemFree(pidl); lvi.iImage = shfi.iIcon; } // It proved necessary to reset the state bits... lvi.stateMask = 0; lvi.state = 0; // Link and Share Overlay lplvid->lpsf->lpVtbl->GetAttributesOf( lplvid->lpsf, 1,&lplvid->pidl, &dwAttributes); if (dwAttributes & SFGAO_LINK) { lvi.mask |= LVIF_STATE; lvi.stateMask |= LVIS_OVERLAYMASK; lvi.state |= INDEXTOOVERLAYMASK(2); } if (dwAttributes & SFGAO_SHARE) { lvi.mask |= LVIF_STATE; lvi.stateMask |= LVIS_OVERLAYMASK; lvi.state |= INDEXTOOVERLAYMASK(1); } // Fade hidden/system files if (!lpdl->bNoFadeHidden) { WIN32_FIND_DATA fd; if (NOERROR == SHGetDataFromIDList(lplvid->lpsf,lplvid->pidl, SHGDFIL_FINDDATA,&fd,sizeof(WIN32_FIND_DATA))) { if ((fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) || (fd.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)) { lvi.mask |= LVIF_STATE; lvi.stateMask |= LVIS_CUT; lvi.state |= LVIS_CUT; } } } lvi.iSubItem = 0; ListView_SetItem(hwnd,&lvi); } iItem++; } if (lpshi) lpshi->lpVtbl->Release(lpshi); CoUninitialize(); SetEvent(lpdl->hTerminatedThread); ExitThread(0); return(0); }
int DriveBox_Fill(HWND hwnd) { LPSHELLFOLDER lpsfDesktop; LPSHELLFOLDER lpsf; // Workspace == CSIDL_DRIVES LPITEMIDLIST pidl; LPITEMIDLIST pidlEntry; LPENUMIDLIST lpe; COMBOBOXEXITEM cbei; LPDC_ITEMDATA lpdcid; ULONG dwAttributes = 0; DWORD grfFlags = SHCONTF_FOLDERS; // Init ComboBox SendMessage(hwnd,WM_SETREDRAW,0,0); SendMessage(hwnd,CB_RESETCONTENT,0,0); ZeroMemory(&cbei,sizeof(COMBOBOXEXITEM)); cbei.mask = CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE | CBEIF_LPARAM; cbei.pszText = LPSTR_TEXTCALLBACK; cbei.cchTextMax = MAX_PATH; cbei.iImage = I_IMAGECALLBACK; cbei.iSelectedImage = I_IMAGECALLBACK; // Get pidl to [My Computer] if (NOERROR == SHGetSpecialFolderLocation(hwnd, CSIDL_DRIVES, &pidl)) { // Get Desktop Folder if (NOERROR == SHGetDesktopFolder(&lpsfDesktop)) { // Bind pidl to IShellFolder if (NOERROR == lpsfDesktop->lpVtbl->BindToObject( lpsfDesktop, pidl, NULL, &IID_IShellFolder, &lpsf)) { // Create an Enumeration object for lpsf if (NOERROR == lpsf->lpVtbl->EnumObjects( lpsf, hwnd, grfFlags, &lpe)) { // Enumerate the contents of [My Computer] while (NOERROR == lpe->lpVtbl->Next( lpe, 1, &pidlEntry, NULL)) { // Add item to the List if it is part of the // Filesystem dwAttributes = SFGAO_FILESYSTEM; lpsf->lpVtbl->GetAttributesOf( lpsf, 1, &pidlEntry, &dwAttributes); if (dwAttributes & SFGAO_FILESYSTEM) { // Windows XP: check if pidlEntry is a drive SHDESCRIPTIONID di; HRESULT hr; hr = SHGetDataFromIDList(lpsf,pidlEntry,SHGDFIL_DESCRIPTIONID, &di,sizeof(SHDESCRIPTIONID)); if (hr != NOERROR || (di.dwDescriptionId >= SHDID_COMPUTER_DRIVE35 && di.dwDescriptionId <= SHDID_COMPUTER_OTHER)) { lpdcid = CoTaskMemAlloc(sizeof(DC_ITEMDATA)); //lpdcid->pidl = IL_Copy(pidlEntry); lpdcid->pidl = pidlEntry; lpdcid->lpsf = lpsf; lpsf->lpVtbl->AddRef(lpsf); // Insert sorted ... { COMBOBOXEXITEM cbei2; LPDC_ITEMDATA lpdcid2; HRESULT hr; cbei2.mask = CBEIF_LPARAM; cbei2.iItem = 0; while ((SendMessage(hwnd,CBEM_GETITEM,0,(LPARAM)&cbei2))) { lpdcid2 = (LPDC_ITEMDATA)cbei2.lParam; hr = (lpdcid->lpsf->lpVtbl->CompareIDs( lpdcid->lpsf, 0, lpdcid->pidl, lpdcid2->pidl)); if ((short)(SCODE_CODE(GetScode(hr))) < 0) break; else cbei2.iItem++; } cbei.iItem = cbei2.iItem; cbei.lParam = (LPARAM)lpdcid; SendMessage(hwnd,CBEM_INSERTITEM,0,(LPARAM)&cbei); } } } } // IEnumIDList::Next() lpe->lpVtbl->Release(lpe); } // IShellFolder::EnumObjects() lpsf->lpVtbl->Release(lpsf); } // IShellFolder::BindToObject() CoTaskMemFree(pidl); } // SHGetSpecialFolderLocation() lpsfDesktop->lpVtbl->Release(lpsfDesktop); } // SHGetDesktopFolder() SendMessage(hwnd,WM_SETREDRAW,1,0); // Return number of items added to combo box return ((int)SendMessage(hwnd,CB_GETCOUNT,0,0)); }
BOOL CFileSearch::EnumAllItems(IEnumIDList *m_pEnum,BOOL isFolder,BOOL isQuickLanch) { LPITEMIDLIST m_pItem=NULL; ULONG m_ulwork= 0; while(m_pEnum->Next(1,&m_pItem,&m_ulwork)==S_OK) { //如果是第一层,重置路径 if(!isQuickLanch) { if((m_pFirstLayerFolder==m_pEnum) && (isFolder)) { lstrcpy(m_strParentPath,m_strDeskTopPath); } if((m_pFirstLayerFile==m_pEnum) && (!isFolder)) { lstrcpy(m_strParentPath,m_strDeskTopPath); } } else { // if((m_pFirstLayerFile==m_pEnum) && (!isFolder)) // { // lstrcpy(m_strParentPath,m_strQuickLanchPath); // } if((m_pFirstLayerFolder==m_pEnum) && (isFolder)) { lstrcpy(m_strParentPath,m_strDeskTopPath); } if((m_pFirstLayerFile==m_pEnum) && (!isFolder)) { lstrcpy(m_strParentPath,m_strDeskTopPath); } } WIN32_FIND_DATA ffd; SHGetDataFromIDList(m_pIShellFolder,m_pItem,SHGDFIL_FINDDATA,&ffd,sizeof(WIN32_FIND_DATA)); if(!isFolder) { CString m_strTempPath=m_strParentPath; m_strTempPath+="\\"; m_strTempPath += ffd.cFileName; CString m_strCmp=".lnk"; fprintf(fp,"%s\n",m_strTempPath.GetBuffer()); m_strTempPath.MakeUpper(); m_strCmp.MakeUpper(); if(m_strTempPath.Right(4)==m_strCmp) //判断是否是链接文件 { if (ReadShortCut(m_strTempPath.GetBuffer())) { string str = m_strTempPath.GetBuffer(); m_FindList.push_back(str); } m_strTempPath.ReleaseBuffer(); } } else { lstrcat(m_strParentPath,"\\"); lstrcat(m_strParentPath,ffd.cFileName); IShellFolder *m_pITemp=GetIShellFolderByPath(m_strParentPath); GetIEunmIDList(m_pITemp,TRUE,isQuickLanch); } } return TRUE; }
BOOL Network::GetNethoodTarget(LPCWSTR szFolder,LPWSTR szTarget,DWORD nBufferLen) { CStringW file(szFolder); if (file.LastChar()!=L'\\') file << L'\\'; file << L"desktop.ini"; WCHAR cls[300]; if (IsUnicodeSystem()) { if (!GetPrivateProfileStringW(L".ShellClassInfo",L"CLSID2",szwEmpty,cls,300,file)) return FALSE; } else { char clsA[300]; if (!GetPrivateProfileString(".ShellClassInfo","CLSID2",szEmpty,clsA,300,W2A(file))) return FALSE; MultiByteToWideChar(CP_ACP,0,clsA,-1,cls,300); } if (wcscmp(cls,L"{0AFACED1-E828-11D1-9187-B532F1E9575D}")!=0) return FALSE; // Folder shortcut IShellLink* psl; if (!SUCCEEDED(CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl))) return FALSE; IPersistFile* ppf; if (!SUCCEEDED(psl->QueryInterface(IID_IPersistFile,(void**)&ppf))) { psl->Release(); return FALSE; } IShellFolder* psf; if (!SUCCEEDED(SHGetDesktopFolder(&psf))) { ppf->Release(); psl->Release(); return FALSE; } file=szFolder; if (file.LastChar()!=L'\\') file << L'\\'; file << L"target.lnk"; BOOL bRet=FALSE; if (SUCCEEDED(ppf->Load(file,0))) { LPITEMIDLIST il; if (SUCCEEDED(psl->GetIDList(&il))) { STRRET str; if (SUCCEEDED(psf->GetDisplayNameOf(il,SHGDN_FORPARSING,&str))) { if (ShellFunctions::StrRetToStr(str,il,szTarget,nBufferLen)) bRet=2; } else { SHDESCRIPTIONID di; if (SUCCEEDED(SHGetDataFromIDList(psf,il,SHGDFIL_DESCRIPTIONID,&di,sizeof(SHDESCRIPTIONID)))) { if (di.clsid==CLSID_NetworkPlaces) { if (SUCCEEDED(psf->GetDisplayNameOf(il,SHGDN_FORPARSING,&str))) { if (ShellFunctions::StrRetToStr(str,il,szTarget,nBufferLen)) bRet=szTarget[0]=='\\' && szTarget[1]=='\\'; } } } } CoTaskMemFree(il); } } psf->Release(); ppf->Release(); psl->Release(); return bRet; }
bool ShellDirectory::fill_w32fdata_shell(LPCITEMIDLIST pidl, SFGAOF attribs, WIN32_FIND_DATA* pw32fdata, BY_HANDLE_FILE_INFORMATION* pbhfi, bool do_access) { CONTEXT("ShellDirectory::fill_w32fdata_shell()"); bool bhfi_valid = false; if (do_access && !( (attribs&SFGAO_FILESYSTEM) && SUCCEEDED( SHGetDataFromIDList(_folder, pidl, SHGDFIL_FINDDATA, pw32fdata, sizeof(WIN32_FIND_DATA))) )) { WIN32_FILE_ATTRIBUTE_DATA fad; IDataObject* pDataObj; STGMEDIUM medium = {0, {0}, 0}; FORMATETC fmt = {g_Globals._cfStrFName, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; HRESULT hr = _folder->GetUIObjectOf(0, 1, &pidl, IID_IDataObject, 0, (LPVOID*)&pDataObj); if (SUCCEEDED(hr)) { hr = pDataObj->GetData(&fmt, &medium); pDataObj->Release(); if (SUCCEEDED(hr)) { LPCTSTR path = (LPCTSTR)GlobalLock(medium.UNION_MEMBER(hGlobal)); if (path) { // fill with drive names "C:", ... assert(_tcslen(path) < GlobalSize(medium.UNION_MEMBER(hGlobal))); _tcscpy(pw32fdata->cFileName, path); UINT sem_org = SetErrorMode(SEM_FAILCRITICALERRORS); if (GetFileAttributesEx(path, GetFileExInfoStandard, &fad)) { pw32fdata->dwFileAttributes = fad.dwFileAttributes; pw32fdata->ftCreationTime = fad.ftCreationTime; pw32fdata->ftLastAccessTime = fad.ftLastAccessTime; pw32fdata->ftLastWriteTime = fad.ftLastWriteTime; if (!(fad.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { // copy file size pw32fdata->nFileSizeLow = fad.nFileSizeLow; pw32fdata->nFileSizeHigh = fad.nFileSizeHigh; } else { // ignore FILE_ATTRIBUTE_HIDDEN attribute of NTFS drives - this would hide those drives in ShellBrowser if (pw32fdata->dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) { if (path[1]==':' && path[2]=='\\' && !path[3]) // Is it a drive path? pw32fdata->dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN; } } } HANDLE hFile = CreateFile(path, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); if (hFile != INVALID_HANDLE_VALUE) { if (GetFileInformationByHandle(hFile, pbhfi)) bhfi_valid = true; CloseHandle(hFile); } SetErrorMode(sem_org); GlobalUnlock(medium.UNION_MEMBER(hGlobal)); GlobalFree(medium.UNION_MEMBER(hGlobal)); } } } } if (!do_access || !(attribs&SFGAO_FILESYSTEM)) // Archiv files should not be displayed as folders in explorer view. if (attribs & (SFGAO_FOLDER|SFGAO_HASSUBFOLDER)) pw32fdata->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; if (attribs & SFGAO_READONLY) pw32fdata->dwFileAttributes |= FILE_ATTRIBUTE_READONLY; if (attribs & SFGAO_COMPRESSED) pw32fdata->dwFileAttributes |= FILE_ATTRIBUTE_COMPRESSED; return bhfi_valid; }