An application can customize the icons that the shell displays for the application's file types. The icon interface also allows an application to specify icons for folders and subfolders within the application's file structure.
An application can specify icons for its file types in two ways. The simplest way is to specify a class icon to be used for all files of a particular file type by adding a DefaultIcon key to the registry under the program information. For information about specifying a class icon, see Setting Default Icons for File Classes.
An application can use the %1 value with the DefaultIcon key. This value denotes that each file instance of this type can have a different icon. The application must supply an icon handler for the file type and add an IconHandler key to the shellex key for the application. An application can have only one entry for the IconHandler key, and the value of its key denotes the CLSID of the icon handler.
shellex
IconHandler
{00000000-1111-2222-3333-00000000000003}
DefaultIcon = %1
To have customized icons, an application must provide an icon handler that implements the IExtractIcon interface. The system follows these steps when it is about to display an icon for a file type that has instance-specific icons:
1.Retrieves the class identifier of the handler.
2.Creates a handler object by calling the CoCreateInstance function with the CLSID.
3.Initializes the instance by calling the IPersistFile::Load member function.
4.Uses the QueryInterface member function to get to the IExtractIcon interface.
5.Calls the IExtractIcon::GetIconLocation and IExtractIcon::Extract member functions.
The IExtractIcon interface has the Extract and GetIconLocation member functions in addition to the usual IUnknown member functions.
The system calls the GetIconLocation member function to get the location and index of an icon to display. Typically, the icon location is an executable or DLL filename, but it can be any file.
The system calls the Extract member function when it needs to display an icon for a file that does not reside in an executable or DLL file. Applications usually have the file icons in their executable or DLL files, so icon handlers can simply implement this member function as a return-only function that returns the E_FAIL error value. You need to implement the Extract member function only if the icon image is stored in a file in an application-defined format. When the icon for a file is in a separate .ICO file (or any other type of file), the icon handler must extract the icon for the shell and return it in this member function.