Wednesday, May 05, 2010

How the shell converts an icon location into an icon

A customer had trouble getting an icon to display for a registered file type.

   In my resource file, I specify the icon like this:

   101 ICON awesome.ico

   And when I register my file type, I set it like this:

   [HKEY_CLASSES_ROOT\.xyz\DefaultIcon]
   @="C:\path\to\awesome.exe,101"

   However, when I view an .xyz file, my awesome icon doesn't appear. On the other hand, if I change the 101 to a 0, then it works. Why? Isn't the number in the resource file the resource ID?

Why yes, in fact, the number in the resource file is indeed the resource ID. But the number after the comma in the Default­Icon isn't.

The format of shell icon locations (used most visibly by Default­Icon, but also used in other places) is «file»,«index», where the index is a zero-based index of the icon in your resources. In other words, an index of zero means "Give me the first icon in the file." The resource compiler sorts icons numerically by resource ID, so the first icon in the file is the icon with the numerically lowest resource ID. In the above example, apparently there are no icons with resource IDs less than 101; that would explain why asking for icon index zero results in the awesome icon.

The function behind all this icon hunting is Extract­Icon. The icon location string is split up at the comma into a path and an integer, and that path and integer are passed to the Extract­Icon function. Since the Extract­Icon function interprets the integer as the icon index, that's what the integer in your icon location string means.

Read more: The old new thing

Posted via email from jasper22's posterous