как получить путь к корзине Windows invoke SHGetFolderPath,0,CSIDL_BITBUCKET,0,0,ADDR pathRecycleBin не работает, хотя пути с другими значениями CSIDL выдаёт желательно с примером
Да, хороший вопрос Мне удалось только получить ITEMIDLIST, а как получить из него путь в файловой системе - хз. Код (Text): LPITEMIDLIST id; HRESULT res = SHGetFolderLocation (0, CSIDL_BITBUCKET, 0, 0, &id); P.S. А функция SHGetFolderPath вообще не поддерживает параметр CSIDL_BITBUCKET.
Хотя бы попробовал сам, перед тем как сообщение писать SHGetSpecialFolderPath возвращает FALSE, да и в MSDN написано "If a virtual folder is specified, this function will fail". SHGetSpecialFolderLocation вроде работает, возвращает какое-то LPITEMIDLIST, да вот только преобразовать его в файловый путь не удается: SHGetPathFromIDList возвращает FALSE. Так что вопрос остается открытым.
Ты б еще к нортоновскому Unerase определял... Сканируй все диски на наличие каталогов Recycled, ищи в нем desktop.ini проверяй наличие в нем [.ShellClassInfo] CLSID={645FF040-5081-101B-9F08-00AA002F954E} Если это есть, значит точно корзина.
MSDN. Код (Text): IMalloc * pShellMalloc = NULL; // A pointer to the shell's IMalloc interface IShellFolder *psfParent; // A pointer to the parent folder object's IShellFolder interface. LPITEMIDLIST pidlItem = NULL; // The item's PIDL. LPITEMIDLIST pidlRelative = NULL; // The item's PIDL relative to the parent folder. STRRET str; // The structure for strings returned from IShellFolder. WCHAR szDisplayName[MAX_PATH]= L""; // The display name's string for Favorites WCHAR szPath[MAX_PATH] = L""; // The path for Favorites. HRESULT hres = SHGetMalloc(&pShellMalloc); if (FAILED(hres)) { return hres; } hres = SHGetSpecialFolderLocation(NULL, CSIDL_BITBUCKET, &pidlItem); if (SUCCEEDED(hres)) { hres = SHBindToParent(pidlItem, IID_IShellFolder, (void**)&psfParent, (LPCITEMIDLIST*)&pidlRelative); if (SUCCEEDED(hres)) { // Retrieve the display name memset(&str, 0, sizeof(str)); hres = psfParent->GetDisplayNameOf(pidlRelative, SHGDN_NORMAL, &str); if (SUCCEEDED(hres)) { StrRetToBuf(&str, pidlItem, szDisplayName, ARRAYSIZE(szDisplayName)); } // Retrieve the path memset(&str, 0, sizeof(str)); hres = psfParent->GetDisplayNameOf(pidlRelative, SHGDN_NORMAL | SHGDN_FORPARSING, &str); if (SUCCEEDED(hres)) { StrRetToBuf(&str, pidlItem, szPath, ARRAYSIZE(szPath)); } psfParent->Release(); } } // Clean up allocated memory if (pidlItem) { pShellMalloc->Free(pidlItem); } if (pidlRelative) { pShellMalloc->Free(pidlRelative); } pShellMalloc->Release();
n0name ... The display name's string for Favorites ... The path for Favorites ... CSIDL_BITBUCKET ... Код из справки для _мобильной_ платформы - MSDN -> Mobile and Embedded Development - > ... -> SHGetSpecialFolderLocation? В оригинале CSIDL_FAVORITES. Прокомментируешь?
Можно по подробнее про следующие функции (про аргументы)? В MSDN непонятно. SHGetSpecialFolderLocation(NULL,CSIDL_BITBUCKET,&pidlItem) SHBindToParent(pidlItem,IID_IShellFolder,(void**)&psfParent,(LPCITEMIDLIST*)&pidlRelative)
vg В MSDN непонятно В общих чертах. Первая функция в последнем параметре возвращает абсолютный (относительно рабочего стола) идентификатор для специальной папки. Вторая для идентификатора, указанного в первом параметре, возвращает в третьем параметре указатель на интерфейс (вид во втором параметре, в данном случае IShellFolder) для родителя, а в четвертом параметре возвращается относительный (относительно родителя) идентификатор. Делается это в надежде, что родителя можно попросить информацию о детях, т.е. использовать его методы, в данном случае GetDisplayNameOf. #1 как получить путь к корзине Windows #8 ну как-нибудь же можно определить путь к файлу удалённому в корзину Пояснишь что, а главное, зачем тебе это надо? Может быть ты хочешь посмотреть список удаленного в корзину и посмотреть какие-либо свойства элементов этого списка?
vg удалить файл из корзины Теоретически так Код (Text): #define ARRAYSIZE(x) (sizeof(x) / sizeof(x[0])) IShellFolder *psfdt; // desktop IShellFolder *psfrb; // recyclebin IEnumIDList *peidl; LPITEMIDLIST piidl; LPITEMIDLIST pidlrb; LPMALLOC pm; CoInitialize(NULL); SHGetMalloc(&pm); // получить доступ к корзине через IShellFolder SHGetDesktopFolder(&psfdt); SHGetSpecialFolderLocation(NULL, CSIDL_BITBUCKET, &pidlrb); psfdt->lpVtbl->BindToObject(psfdt, pidlrb, NULL, &IID_IShellFolder, (LPVOID *) &psfrb); // получить доступ к списку элементов в корзине psfrb->lpVtbl->EnumObjects(psfrb, NULL, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &peidl); // организовать цикл просмотра элементов while (NOERROR == peidl->lpVtbl->Next(peidl, 1, &piidl, NULL)) { STRRET str; TCHAR sz0[ 1024 ]; // Original TCHAR sz1[ 1024 ]; // RecycleBin // получить имя до удаления sz0[ 0 ] = TEXT('\0'); psfrb->lpVtbl->GetDisplayNameOf(psfrb, piidl, SHGDN_NORMAL, &str); StrRetToBuf(&str, piidl, sz0, ARRAYSIZE(sz0)); if (STRRET_WSTR == str.uType) pm->lpVtbl->Free(pm, str.pOleStr); // получить имя в корзине sz1[ 0 ] = TEXT('\0'); psfrb->lpVtbl->GetDisplayNameOf(psfrb, piidl, SHGDN_FORPARSING, &str); StrRetToBuf(&str, piidl, sz1, ARRAYSIZE(sz1)); if (STRRET_WSTR == str.uType) pm->lpVtbl->Free(pm, str.pOleStr); // к этому моменту: // sz0 - имя файла до удаления, вдруг пригодится // sz1 - имя файла в корзине, для SHFileOperation // piidl - идентификатор элемента в корзине, // для получения контекстного меню // // метод с использованием SHFileOperation, // не уверен, что этот метод позволяет оболочке корректно // синхронизировать базу удаленных элементов (файл info2) // с собственно удаленными элементами, лежащими в корзине, // у меня получилось удалить когда программа выполнялась // под OllyDbg, иначе SHFileOperation завершалась с ошибкой // SHFILEOPSTRUCT fos; RtlZeroMemory(&fos, sizeof(fos)); fos.wFunc = FO_DELETE; fos.pFrom = sz1; fos.fFlags = FOF_NOCONFIRMATION | FOF_SILENT; SHFileOperation(&fos); // // метод через контекстное меню, то самое, которое у // элемента корзины вызывается правой кнопкой, по идее // правильный метод, однако не знаю как отнесется // IEnumIDList к тому, что удален очередной элемент, // у меня получилось удалить только файл в корзине на // диске Ц (в этой корзине есть папка пользователя), при // этом появлялось окошко запроса на подтверждения // удаления файла из корзины // IContextMenu *pcm; CMINVOKECOMMANDINFO cmiki; // получить контекстное меню для очередного элемента psfrb->lpVtbl->GetUIObjectOf(psfrb, NULL, 1, &piidl, &IID_IContextMenu, NULL, (LPVOID *) &pcm); // // Через контекстное меню "правильный" метод // HMENU hMenu = CreatePopupMenu(); UINT off = 0; // выгрузить контекстное меню в свое pCtxMenu->lpVtbl->QueryContextMenu(pcm, hMenu, 0, off, (UINT) -1, CMF_NORMAL); UINT ui; UINT uiDelete = (UINT)-1; UINT uiCount = GetMenuItemCount(hMenu); // перебирать элементы своего меню для получения IDM_xxx // которые будем передавать в контекстное меню для получения // language-independent command name for (ui = 0; ui < uiCount; ui++) { TCHAR sz[ 1024 ]; if (0 != GetMenuString(hMenu, ui, sz, ARRAYSIZE(sz), MF_BYPOSITION)) { UINT uiID = GetMenuItemID(hMenu, ui); if (((UINT)-1 != uiID) && (0 != uiID)) { pcm->lpVtbl->GetCommandString(pcm, uiID - off, GCS_VERB, NULL, sz, ARRAYSIZE(sz)); if (0 == lstrcmpi(sz, TEXT("delete"))) { uiDelete = uiID - off; break; } } } } if ((UINT)-1 != uiDelete) { RtlZeroMemory(&cmiki, sizeof(cmiki)); cmiki.cbSize = sizeof(cmiki); cmiki.fMask = CMIC_MASK_FLAG_NO_UI; cmiki.lpVerb = MAKEINTRESOURCE(uiDelete); cmiki.nShow = SW_HIDE; pcm->lpVtbl->InvokeCommand(pcm, &cmiki); SHChangeNotify(SHCNE_ALLEVENTS, SHCNF_FLUSH | SHCNF_IDLIST, pidlrb, NULL); } // // Через контекстное меню метод "в лоб" // RtlZeroMemory(&cmiki, sizeof(cmiki)); cmiki.cbSize = sizeof(cmiki); cmiki.fMask = CMIC_MASK_FLAG_NO_UI; cmiki.lpVerb = "delete"; cmiki.nShow = SW_HIDE; pcm->lpVtbl->InvokeCommand(pcm, &cmiki); SHChangeNotify(SHCNE_ALLEVENTS, SHCNF_FLUSH | SHCNF_IDLIST, pidlrb, NULL); // освободить контекстное меню pcm->lpVtbl->Release(pcm); // освободить очередной элемент корзины pm->lpVtbl->Free(pm, piidl); } // почистить за собой peidl->lpVtbl->Release(peidl); psfrb->lpVtbl->Release(psfrb); psfdt->lpVtbl->Release(psfdt); pm->lpVtbl->Free(pm, pidlrb); CoUninitialize();
Спасибо за разъяснения. Но я плохо понимаю си. Поэтому, если можно, ещё раз первый метод, только на ассемблере.
vg ещё раз первый метод Я копаю второй. только на ассемблере Шутишь? Код еще на Си еще не работает, а ты хочешь раздуть его на тысячу строк. Если есть конкретные вопросы, задавай.
Адрес корзины для диска получить можно так: Получить Sid с помощью NtQueryTokenValue с параметром UserToken, передать его RtLConvertSidToString. Полученную строку вставить в следующую (для диска с): C:\recyclebin\%%\myfile Пишу по памяти и с мобильного, так что с именами мог что напутать. Знатоки, надеюсь,исправят
именами мог что напутать ... надеюсь,исправят Вместо NtQueryTokenValue следует читать ZwQueryInformationToken.
Masm32 пишет undefined symbol по этим функциям. Не могу найти нормальной инфы по ним. Что это за функции? Какие у них аргументы? Какие библиотеки требуют? Что возвращают? Можно пару строчек кода (на ассемблере)?