Работа с виртуальными папками и файлами
Модераторы: Duncon, Hawk, Romeo, Eugie
Доброго времени суток.
Имею:
Мобильное утройство, подключенное к компьютеру с Виндовс ХР.
Это устройство отображается в виде объекта в "моем компьютере".
Через проводник виндовый могу зайти в это устройство, увидеть его ФС и так далее.
Могу залезть программно в это устройство, увидеть папки в его ФС.
Задача:
вытащить файлы из определенных папок этого устройства.
Проблема:
программно не вижу файлов и не представляю как их оттуда выдернуть.
Замечание:
для навигации по папкам использую SHGetDesktopFolder и итеративно перебираю все папки входящие в нее, спускаясь ниже.
Имею:
Мобильное утройство, подключенное к компьютеру с Виндовс ХР.
Это устройство отображается в виде объекта в "моем компьютере".
Через проводник виндовый могу зайти в это устройство, увидеть его ФС и так далее.
Могу залезть программно в это устройство, увидеть папки в его ФС.
Задача:
вытащить файлы из определенных папок этого устройства.
Проблема:
программно не вижу файлов и не представляю как их оттуда выдернуть.
Замечание:
для навигации по папкам использую 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Очень на то похоже, хотя я и включаю флаг ..._NONFOLDER
То есть енамобжектс возвращает нормальный ответ, а когда делаю Next, то получаю ошибку
То есть енамобжектс возвращает нормальный ответ, а когда делаю Next, то получаю ошибку
В SAD - все в SAD.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
1. Попробуй перечислить, все виртуальные айтемы: как файлы, так и папки.
2. Проверяй результат, который возвращает IShellFolder::EnumObjects.
3. Перед тем, как вызывать IEnumIDList::Next, вызови на всякий случай IEnumIDList::Reset.
Результаты исследований приведи в ответе.
2. Проверяй результат, который возвращает IShellFolder::EnumObjects.
3. Перед тем, как вызывать IEnumIDList::Next, вызови на всякий случай IEnumIDList::Reset.
Результаты исследований приведи в ответе.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Все я их вижу - по ходу проблема была в том что они скрытые а я не указывал флаг.
Теперь вопрос- как их все-таки оттуда скопировать на локальный диск ??
Теперь вопрос- как их все-таки оттуда скопировать на локальный диск ??
В 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
А как сконкатинировать данные пидлы ?
В 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
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 - ложь то есть не возвращает имя.
в чем бага может быть ?
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.