Работа с виртуальными папками и файлами

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

Доброго времени суток.
Имею:
Мобильное утройство, подключенное к компьютеру с Виндовс ХР.
Это устройство отображается в виде объекта в "моем компьютере".
Через проводник виндовый могу зайти в это устройство, увидеть его ФС и так далее.
Могу залезть программно в это устройство, увидеть папки в его ФС.
Задача:
вытащить файлы из определенных папок этого устройства.
Проблема:
программно не вижу файлов и не представляю как их оттуда выдернуть.
Замечание:
для навигации по папкам использую SHGetDesktopFolder и итеративно перебираю все папки входящие в нее, спускаясь ниже.
В SAD - все в SAD.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ты хочешь сказать, что IShellFolder::EnumObjects соотвествующего ShellFolder объекта возвращает пустой EnumIDList объект?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

Очень на то похоже, хотя я и включаю флаг ..._NONFOLDER
То есть енамобжектс возвращает нормальный ответ, а когда делаю Next, то получаю ошибку
В SAD - все в SAD.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

1. Попробуй перечислить, все виртуальные айтемы: как файлы, так и папки.
2. Проверяй результат, который возвращает IShellFolder::EnumObjects.
3. Перед тем, как вызывать IEnumIDList::Next, вызови на всякий случай IEnumIDList::Reset.

Результаты исследований приведи в ответе.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

Все я их вижу - по ходу проблема была в том что они скрытые а я не указывал флаг.
Теперь вопрос- как их все-таки оттуда скопировать на локальный диск ??
В SAD - все в SAD.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Нужно спросить у ShellFolder объекта интерфейс IPersistFolder2 и вызвать IPersistFolder2::GetCurFolder. После этого конкатенировать полученный pidl папки с pidl'ом, который вернёт EnumIDList::Next. Полученный full pidl нужно загнать в SHGetPathFromIDList и получить реальный путь к файлу. После этого можно воспользоваться один из миллиона способов скопировать файл, от элементаного CopyFile до навороченного шеловского SHFileOperation.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

А как сконкатинировать данные пидлы ?
В SAD - все в SAD.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Читай MSDN (напиши в поиске "pidl copy" и открой первую же ссылку). Там даны прямо готовые функции для работы с pidl'ами. Стоит только скопировать и вставить в совй код :) .
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

LPSHELLFOLDER folder - папка, содержащая файлы

IPersistFolder2 *pf;

folder->QueryInterface(IID_IPersistFolder2,(void**)&pf);
LPITEMIDLIST pidlFolder;
hr=pf->GetCurFolder(&pidlFolder);
if(SUCCEEDED(hr))
{
LPITEMIDLIST pidlNew;
UINT cb1 = GetSize(pidlFolder) - sizeof(pidlFolder->mkid.cb);
UINT cb2 = GetSize(pidlChild);
IMalloc *g_pMalloc;
SHGetMalloc(&g_pMalloc);
pidlNew = (LPITEMIDLIST)g_pMalloc->Alloc(cb1 + cb2);
if (pidlNew)
{
CopyMemory(pidlNew, pidlChild, cb1);
CopyMemory(((LPSTR)pidlNew) + cb1, pidlFolder, cb2);
}
char path[MAX_PATH];
BOOL ret;
ret=SHGetPathFromIDList(pidlNew,path);

ret - ложь то есть не возвращает имя.
в чем бага может быть ?
В SAD - все в SAD.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Возможно пути к файлу нет, он существует только в виртуально. Нужно подумать.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить