Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the associated icon of a file in HTA (HTML/Javascript/VBScript)

I'm building an HTA application in which I need to display a list of file with their associated system icon.
I'm using FileSystemObject to list the file but there seem to have no way to get the icon...

I've found a script in VBS that can save the icon of a file into a .ico .
It read the file (PE resource file, .exe or dll) and parse the icon data. I modified that script to return the icon's bytes, convert it to base64 and use embed base64 images in HTML. Here's the original script: http://gilpin.us/IconSiphon/

Issue

  1. ) In most case the .ico contains multiple icons (many sizes and color depth) but there's no way I can specify which one to use (as I need 16x16 icons).

  2. ) Not all icons are displayed

  3. ) Could be slow with many file as it read exe and dll (but I'm ok with that, I can cache already fetched icon)

I've also tried some ActiveX control but none seem to work properly. Even those provided by microsoft (ShellFolderView or ListView) are very buggy.

Requirements

  • Must display 16x16 icon

  • Must allow multiple file selection

  • Everything must be embed in hta (if possible). No external .exe

Does anyone know a way to achieve that?

Thanks!

like image 545
Patrick Avatar asked Aug 26 '11 00:08

Patrick


2 Answers

Use SHGetFileInfo() with the SHGFI_ICON flag.

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

like image 77
Sean Chase Avatar answered Oct 11 '22 17:10

Sean Chase


The filesystemobject will provide you the necessary functions for enumerating files on the local filesystem. However to get the icon image you will need to use the win32 api per @seanchase's response or an external exe.

However you can access the win32api via javascript in the hta using the wshApiToolkit activex object - http://www.google.com/search?q=wshAPIToolkit.ucATO%2F&rls=com.microsoft:en-us&ie=UTF-8&oe=UTF-8&startIndex=&startPage=1

Find a copy of that and you're close to being done. It does require distributing the activex object with your code and shell executing the registration process from within the HTA so that might violate your third constraint. Though I believe you can base64 encode the exe into the hta in a dataurl and write that back out to the file system so it would at least be bundled into a single file. If you support that option then maybe embedding an exe that does the same would meet your requriements.

Definitely some hacky stuff that may be unstable on future OS versions - heck I'm not even sure the wshApiToolkit works on windows 7, and 8 is just around the corner. Good luck!

like image 25
Marcus Pope Avatar answered Oct 11 '22 17:10

Marcus Pope