Иконки сетевых ресурсов

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

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

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

11 май 2004, 15:10

Доброго времени суток, господа. У меня здесь возникла проблема с получением иконок сетевых ресурсов. Короче я спокойно получаю IShellFolder объект некого айтема в сетевых ресурсах, но, как выясняется, если этот объект является одним из так называемых "recent" сетевых ресурсов, то он не поодерживает методы интерфейса IExtractIcon (проще говоря QueryInterface с соответствующими параметрами возвращает E_NOINTERFACE).

Вопрос: как IE или тот же WinCmd (TotalCmd) получают иконки этих ресурсов, если даже более тяжеловесная шеловская функция SHGetInfo не может ничего сделать.

P.S. Если нужна дополнительная информация по вопросу - я к вашим услугам.

P.P.S. Если не ошибаюсь, господа Andy и Aik занимались подобными исследованиями. Надеюсь в первую очередь именно на вас.
Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

11 май 2004, 15:49

Romeo, я так эту кухню и доконца и не заборол. В некоторых случаях, на сколько я понимаю, ты должен использовать интерфейс IShellIcon.
P.S: что есть recent сетевой ресурс я так и не понял.
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

11 май 2004, 15:59

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

11 май 2004, 16:15

как IE
IE юзает IExtractIcon.

Почему у тебя не работает - может баги в коде?

Можно еще попробовать так:

Код: Выделить всё

SHGetFileInfo((LPCTSTR)pidl,0,&sfi,sizeof(SHFILEINFO),
    SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_LINKOVERLAY)
Индекс иконки возвращается в sfi.iIcon
*provided AS IS
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

11 май 2004, 16:42

Короче исследования по направлению IShellIcon завершены. Фунциональности у интерфейса меньше, чем у IExtractIcon. А вот насчёт линков - это хорошее замечание. Сейчас почетаем-с что об этом думает MSDN. :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

17 май 2004, 16:31

Всё, господа, проблема решена. Собака порылась именно в линках! На помощь пришёл COM Interface IShellLink. Кому будет интересно, могу рассказать подробнее, обращайтесь.

P.S. Функцией SHGetFileInfo не пользовался из принципа. Тестирования скорости, проведённые намного раньше возникшей проблемы, показали, что, обладая довольно приличной функциональностью, функция SHGetFileInfo на мелких задачах тупит неимоверно! Пользоваться ею лишь для того, чтобы получить иконку - это всё равно, что забивать в сапоги гвозди отбойным молотком :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

17 май 2004, 18:16

функция SHGetFileInfo на мелких задачах тупит неимоверно
Romeo, не перегибай палку. SHGetFileInfo конечно работает немного медленно (что вобщем общеизвестно), но фраза тупит наимоверно это черезчур!
*provided AS IS
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

17 май 2004, 20:14

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

17 май 2004, 20:16

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

17 май 2004, 20:45

Romeo, ну тебе же как я понимаю не тысячу иконок за секунду надо вытащить? :) Ладно, хватит нам флеймить =) Итоги: SHGetFileInfo работает медленно, поэтому надо написать в Microsoft, чтобы в Windows Longhorn эту функцию из shell32.dll убрали %))
*provided AS IS
Ответить