ExtractAssociatedIcon (shell32)
Last changed: -66.206.85.131

.
Summary

C# Signature:

[DllImport("shell32.dll")]
static extern IntPtr ExtractAssociatedIcon(IntPtr hInst, StringBuilder lpIconPath,
   out ushort lpiIcon);

VB Signature:

<DllImport("shell32.dll", CharSet:=CharSet.Auto)> _
Shared Function ExtractAssociatedIcon _
     (ByVal hInst As IntPtr, _
      ByVal iconPath As StringBuilder, _
      ByRef index As Short) As IntPtr
End Function

User-Defined Types:

None.

Notes:

Both the ExtractAssociatedIcon and 'System.Drawing.Icon.ExtractAssociatedIcon' extract only a 32x32 pixels icon.

Another method must be used to aquire other icon sizes.

The ExtractAssociatedIcon function also does not execute as documented. The documentation states that

If the icon is extracted from an associated executable file, the function stores the full path and file name of the executable file in the string pointed to by lpIconPath, and stores the icon's identifier in the WORD pointed to by lpiIcon.

However, tests indicates that the upon return, the contents of both iconPath and index parameters are the same after the function returns successfully.

Parameters:

hInst

in Specifies the instance of the application calling the function.

lpIconPath

in Pointer to a string that specifies the full path and file name of the file that contains the icon. The function extracts the icon handle from that file, or from an executable file associated with that file. If the icon handle is obtained from an executable file, the function stores the full path and file name of that executable in the string pointed to by lpIconPath.

lpiIcon

in, out Pointer to a WORD that specifies the index of the icon whose handle is to be obtained. If the icon handle is obtained from an executable file, the function stores the icon's identifier in the WORD pointed to by lpiIcon.

Tips & Tricks:

Please add some!

Sample Code:

Consider a Winform application with a OpenFileDialog that helps pick some file. This is then passed to the ExtractAssociatedIcon method to get the icon and display in a picture box.

    public partial class IconTest : Form
    {
    [DllImport("shell32.dll")]
    static extern IntPtr ExtractAssociatedIcon(IntPtr hInst, StringBuilder lpIconPath,
       out ushort lpiIcon);

    [DllImport("shell32.dll")]
    static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);

    public IconTest()
    {
        InitializeComponent();
    }

    private void btnBrowse_Click(object sender, EventArgs e)
    {
        openFileDialog1.ShowDialog();

        ushort uicon;
        StringBuilder strB = new StringBuilder(openFileDialog1.FileName);
        IntPtr handle = ExtractAssociatedIcon(this.Handle, strB, out uicon);
        Icon ico = Icon.FromHandle(handle);

        pictureBox1.Image = ico.ToBitmap();
    }
    }

Alternative Managed API:

Use static method 'System.Drawing.Icon.ExtractAssociatedIcon(string filePath)' in assembly 'System.Drawing.dll' (.net 2)

Documentation