Как получить связанный значок файла в HTA (HTML / Javascript / VBScript) - PullRequest
13 голосов
/ 26 августа 2011

Я создаю приложение HTA, в котором мне нужно отобразить список файлов с соответствующим системным значком.
Я использую FileSystemObject, чтобы вывести список файлов, но, похоже, нет возможности получить значок ...

Я нашел скрипт в VBS, который может сохранить значок файла в .ico.
Он читает файл (PE файл ресурсов, .exe или dll) и анализирует данные значка. Я изменил этот скрипт, чтобы он возвращал байты иконки, преобразовывал его в base64 и использовал встраивание изображений base64 в HTML. Вот оригинальный скрипт: http://gilpin.us/IconSiphon/

Выпуск

  1. ) В большинстве случаев .ico содержит несколько значков (разных размеров и глубины цвета), но я не могу указать, какой из них использовать (так как мне нужны значки 16x16).

  2. ) Не все значки отображаются

  3. ) Может быть медленным для многих файлов, так как он читает exe и dll (но я в порядке, я могу кешировать уже извлеченный значок)

Я также попробовал некоторые элементы управления ActiveX, но ни один из них не работает должным образом. Даже те, которые предоставляются Microsoft (ShellFolderView или ListView), очень глючные.

Требования

  • Должен отображаться значок 16x16

  • Необходимо разрешить выбор нескольких файлов

  • Все должно быть вставлено в hta (если это возможно). Нет внешнего .exe

Кто-нибудь знает способ достичь этого?

Спасибо!

Ответы [ 4 ]

1 голос
/ 29 мая 2013

Однажды я создал похожий интерфейс HTA и столкнулся с той же проблемой.Я решил проблему, создав собственную галерею иконок и конвертировав изображения с помощью base64.Вы можете добиться того же, либо конвертируя, либо используя спрайт.Многие пользовательские интерфейсы делают это, даже java.swing имеет свою собственную коллекцию.Как вы заметили, чтение из * .dll может ускорить работу приложения

1 голос
/ 21 июня 2012

Объект файловой системы предоставит вам необходимые функции для перечисления файлов в локальной файловой системе.Однако, чтобы получить изображение значка, вам потребуется использовать 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 кодировать исполняемый файл в hta в dataurl и записать его обратно в файловую систему, чтобы он был как минимум объединен в один файл.Если вы поддерживаете эту опцию, то, возможно, встраивание исполняемого файла, который делает то же самое, будет соответствовать вашим требованиям.

Определенно некоторые хакерские вещи, которые могут быть нестабильными в будущих версиях ОС - черт, я даже не уверен, что wshApiToolkit работает на Windows7 и 8 не за горами.Удачи!

1 голос
/ 03 октября 2012

Вы указали, что открыты для установки компонентов ActiveX и использования их в своем HTA.

Если бы у меня было время, я бы сам решил это, создав компоненты ActiveX с использованием Visual Studio для вызова FindResourceLoadResource и LockResource.Это позволит получить доступ к ресурсу Group Icon, для которого я затем предоставил бы богатые интерфейсы для перебора значков, предлагающих возможность извлекать BMP (или PNG).

Это «как», я бы пошел для достижения этогоесли не считать того, что я действительно ушел.

1 голос
/ 27 марта 2012

Используйте SHGetFileInfo () с флагом SHGFI_ICON.

http://msdn.microsoft.com/en-us/library/windows/desktop/bb762179(v=vs.85).aspx

...