Ответ 1
Используйте SHGetFileInfo() с флагом SHGFI_ICON.
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762179 (v = vs .85).aspx
Я создаю приложение HTA, в котором мне нужно отобразить список файлов со связанным с ним значком системы.
Я использую FileSystemObject
, чтобы перечислить файл, но, похоже, нет способа получить значок...
Я нашел в VBS, который может сохранить значок файла в .ico.
Он читает файл (файл ресурсов PE,.exe или dll) и анализирует данные значка.
Я изменил это значение script, чтобы вернуть байты значков, преобразовать его в base64 и использовать встроенные образы base64 в HTML.
Здесь оригинал script: http://gilpin.us/IconSiphon/
Проблема
) В большинстве случаев .ico содержит несколько значков (много размеров и глубину цвета), но я не могу указать, какой из них использовать (так как мне нужны значки 16x16).
) Не все значки отображаются
) Может быть медленным с большим количеством файлов, поскольку он читает exe и dll (но я в порядке с этим, я могу кэшировать уже извлеченный значок)
Я также пробовал элемент управления ActiveX, но ни один из них не работает должным образом. Даже те, которые предоставляются microsoft (ShellFolderView или ListView), очень ошибочны.
Требования
Должен отображать значок 16x16
Должен разрешить выбор нескольких файлов
Все должно быть включено в hta (если возможно). Нет внешнего .exe
Кто-нибудь знает способ достичь этого?
Спасибо!
Используйте SHGetFileInfo() с флагом SHGFI_ICON.
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762179 (v = vs .85).aspx
В файловой системе будут предоставлены необходимые функции для перечисления файлов в локальной файловой системе. Однако, чтобы получить изображение значка, вам нужно будет использовать win32 api для ответа @seanchase или внешнего exe.
Однако вы можете получить доступ к win32api через javascript в hta, используя объект activex wshApiToolkit - http://www.google.com/search?q=wshAPIToolkit.ucATO%2F&rls=com.microsoft:en-us&ie=UTF-8&oe=UTF-8&startIndex=&startPage=1
Найдите копию этого, и вы близки к тому, чтобы быть готовым. Это требует распространения объекта activex с вашим кодом и оболочкой, выполняющими процесс регистрации из HTA, чтобы это могло нарушить ваше третье ограничение. Хотя я считаю, что вы можете base64 кодировать exe в hta в dataurl и записывать это обратно в файловую систему, чтобы он, по крайней мере, был связан в один файл. Если вы поддерживаете этот вариант, то, возможно, внедряете exe, который сделает то же самое, что и ваши требования.
Определенно некоторые хакерские вещи, которые могут быть неустойчивыми в будущих версиях ОС - черт возьми, я даже не уверен, что wshApiToolkit работает на Windows 7, а 8 не за горами. Удачи!
Вы указали, что вы открываете для установки компонентов ActiveX и используете их в своем HTA.
Если бы у меня было время, я бы применил это для себя, создав компоненты ActiveX с помощью Visual Studio для вызова FindResource
, LoadResource
и LockResource
. Они позволят доступ к ресурсу значка группы, для которого я тогда предоставил бы богатые интерфейсы для итерации через значки, предлагающие возможность извлекать BMP (или PNG).
Это "как", я бы хотел достичь этого, даже если это не удастся сделать это.
Как только я построю аналогичный интерфейс HTA, я столкнулся с той же проблемой. Я решил проблему, создав пользовательскую галерею значков и конвертируя изображения с помощью base64. Вы можете достичь того же путем преобразования или использования спрайта. Многие пользовательские интерфейсы делают это, даже у java.swing есть своя коллекция. Как вы заметили, чтение из *.dll может ускорить приложение