Cómo obtener el ícono asociado de un archivo en HTA(HTML/Javascript/VBScript)
wsh (4)
Use SHGetFileInfo () con el indicador SHGFI_ICON.
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762179(v=vs.85).aspx
Estoy construyendo una aplicación HTA en la que necesito mostrar una lista de archivos con el ícono de sistema asociado.
Estoy usando FileSystemObject
para listar el archivo pero parece que no hay forma de obtener el ícono ...
Encontré un script en VBS que puede guardar el icono de un archivo en .ico.
Lee el archivo (archivo de recursos PE, .exe o dll) y analiza los datos del icono. Modifiqué esa secuencia de comandos para devolver los bytes del icono, convertirlo a base64 y usar las imágenes embebidas base64 en HTML. Aquí está el guión original: http://gilpin.us/IconSiphon/
Problema
) En la mayoría de los casos, el .ico contiene iconos múltiples (muchos tamaños y profundidad de color), pero no hay forma de que pueda especificar cuál usar (ya que necesito iconos de 16x16).
) No se muestran todos los iconos
) Podría ser lento con muchos archivos mientras lee exe y dll (pero estoy de acuerdo con eso, puedo almacenar en caché el icono ya recuperado)
También probé un control ActiveX, pero ninguno parece funcionar correctamente. Incluso los proporcionados por microsoft (ShellFolderView o ListView) son muy defectuosos.
Requisitos
Debe mostrar el icono de 16x16
Debe permitir la selección de múltiples archivos
Todo debe estar incrustado en hta (si es posible). No externo .exe
¿Alguien sabe una manera de lograr eso?
¡Gracias!
El objeto del sistema de archivos le proporcionará las funciones necesarias para enumerar archivos en el sistema de archivos local. Sin embargo, para obtener la imagen del ícono necesitarás usar la API de Win32 por respuesta @ seanchase o un exe externo.
Sin embargo, puede acceder al win32api a través de javascript en la hta utilizando el objeto wshApiToolkit activex - http://www.google.com/search?q=wshAPIToolkit.ucATO%2F&rls=com.microsoft:en-us&ie=UTF-8&oe=UTF -8 & startIndex = & startPage = 1
Encuentra una copia de eso y estás a punto de terminar. Requiere la distribución del objeto activex con su código y el intérprete de comandos ejecutando el proceso de registro desde dentro de la HTA para que pueda violar su tercera restricción. Aunque creo que puedes basar64 para codificar el exe en el hta en una columna de datos y escribirlo en el sistema de archivos para que al menos esté incluido en un solo archivo. Si usted apoya esa opción, entonces la inclusión de un exe que haga lo mismo cumpliría con sus requisitos.
Definitivamente algunas cosas chulas que pueden ser inestables en futuras versiones del sistema operativo - diablos, ni siquiera estoy seguro de que wshApiToolkit funcione en Windows 7, y 8 está a la vuelta de la esquina. ¡Buena suerte!
Usted indicó que está abierto para instalar componentes ActiveX y usarlos en su HTA.
Si tuviera tiempo, lo abordaría yo mismo creando componentes ActiveX utilizando Visual Studio para llamar a FindResource
, LoadResource
y LockResource
. Esto permitirá el acceso al recurso Icono de grupo para el que luego proporcionaría interfaces ricas para iterar a través de los iconos que ofrecen la capacidad de extraer BMP (o PNG).
Este es el "cómo" iría por lograr esto antes que dejar de hacerlo.
Una vez que construí una interfaz HTA similar, me enfrenté al mismo problema. Resolví el problema creando una galería de iconos personalizada y convirtiendo las imágenes usando base64. Puede lograr lo mismo al convertir o usar sprite. Muchas UI lo hacen, incluso java.swing tiene su propia colección embbebed. Como habrás notado, leer desde * .dll puede acelerar la aplicación