How can I use the images within shell32.dll in my C# project?

Viewed 15479

How can I use the images within shell32.dll in my C# project?

5 Answers

The code in the accepted answer leaks one icon handle each time it's called, as it always asks for two icon handles and only gives one back.

Here is a version that doesn't leak a handle:

public static Icon Extract(string filePath, int index, bool largeIcon = true)
{
    if (filePath == null)
        throw new ArgumentNullException(nameof(filePath));

    IntPtr hIcon;
    if (largeIcon)
    {
        ExtractIconEx(filePath, index, out hIcon, IntPtr.Zero, 1);
    }
    else
    {
        ExtractIconEx(filePath, index, IntPtr.Zero, out hIcon, 1);
    }

    return hIcon != IntPtr.Zero ? Icon.FromHandle(hIcon) : null;
}

[DllImport("shell32", CharSet = CharSet.Unicode)]
private static extern int ExtractIconEx(string lpszFile, int nIconIndex, out IntPtr phiconLarge, IntPtr phiconSmall, int nIcons);

[DllImport("shell32", CharSet = CharSet.Unicode)]
private static extern int ExtractIconEx(string lpszFile, int nIconIndex, IntPtr phiconLarge, out IntPtr phiconSmall, int nIcons);
Related