How do you get the icons out of shell32.dll?

WindowsIcons

Windows Problem Overview


I'd like to get the Tree icon to use for a homegrown app. Does anyone know how to extract the images out as .icon files? I'd like both the 16x16 and 32x32, or I'd just do a screen capture.

Windows Solutions


Solution 1 - Windows

If anyone is seeking an easy way, just use 7zip to unzip the shell32.dll and look for the folder .src/ICON/

Solution 2 - Windows

In Visual Studio, choose "File Open..." then "File...". Then pick the Shell32.dll. A folder tree should be opened, and you will find the icons in the "Icon" folder.

To save an Icon, you can right-click on the icon in the folder tree and choose "Export".

Solution 3 - Windows

Another option is to use a tool such as ResourceHacker. It handles way more than just icons as well. Cheers!

Solution 4 - Windows

I needed to extract icon #238 from shell32.dll and didn't want to download Visual Studio or Resourcehacker, so I found a couple of PowerShell scripts from Technet (thanks John Grenfell and to #https://social.technet.microsoft.com/Forums/windowsserver/en-US/16444c7a-ad61-44a7-8c6f-b8d619381a27/using-icons-in-powershell-scripts?forum=winserverpowershell) that did something similar and created a new script (below) to suit my needs.

The parameters I entered were (the source DLL path, target icon file name and the icon index within the DLL file):

C:\Windows\System32\shell32.dll

C:\Temp\Restart.ico

238

I discovered the icon index that I needed was #238 by trial and error by temporarily creating a new shortcut (right-click on your desktop and select New --> Shortcut and type in calc and press Enter twice). Then right-click the new shortcut and select Properties then click 'Change Icon' button in the Shortcut tab. Paste in path C:\Windows\System32\shell32.dll and click OK. Find the icon you wish to use and work out its index. NB: Index #2 is beneath #1 and not to its right. Icon index #5 was at the top of column two on my Windows 7 x64 machine.

If anyone has a better method that works similarly but obtains higher quality icons then I'd be interested to hear about it. Thanks, Shaun.

#Windows PowerShell Code###########################################################################
# http://gallery.technet.microsoft.com/scriptcenter/Icon-Exporter-e372fe70
#
# AUTHOR: John Grenfell
#
###########################################################################

<#
.SYNOPSIS
   Exports an ico and bmp file from a given source to a given destination
.Description
   You need to set the Source and Destination locations. First version of a script, I found other examples but all I wanted to do as grab and ico file from an exe but found getting a bmp useful. Others might find useful
   No error checking I'm afraid so make sure your source and destination locations exist!
.EXAMPLE
    .\Icon_Exporter.ps1
.Notes
        Version HISTORY:
        1.1 2012.03.8
#>
Param ( [parameter(Mandatory = $true)][string] $SourceEXEFilePath,
        [parameter(Mandatory = $true)][string] $TargetIconFilePath
)
CLS
#"shell32.dll" 238
If ($SourceEXEFilePath.ToLower().Contains(".dll")) {
	$IconIndexNo = Read-Host "Enter the icon index: "
	$Icon = [System.IconExtractor]::Extract($SourceEXEFilePath, $IconIndexNo, $true)	
} Else {
	[void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")
	[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
	$image = [System.Drawing.Icon]::ExtractAssociatedIcon("$($SourceEXEFilePath)").ToBitmap()
	$bitmap = new-object System.Drawing.Bitmap $image
	$bitmap.SetResolution(72,72)
	$icon = [System.Drawing.Icon]::FromHandle($bitmap.GetHicon())
}
$stream = [System.IO.File]::OpenWrite("$($TargetIconFilePath)")
$icon.save($stream)
$stream.close()
Write-Host "Icon file can be found at $TargetIconFilePath"

Solution 5 - Windows

[Resources Extract][1] is another tool that will recursively find icons from a lot of DLLs, very handy IMO.

[1]: http://www.nirsoft.net/utils/resources_extract.html "Resources Extract"

Solution 6 - Windows

Just open the DLL with IrfanView and save the result as a .gif or .jpg.

I know this question is old, but it's the second google hit from "extract icon from dll", I wanted to avoid installing anything on my workstation and I remembered I use IrfanView.

Solution 7 - Windows

You can download freeware Resource Hacker and then follow below instructions :

  1. Open any dll file you wish to find icons from.
  2. Browse folders to find specific icons.
  3. From menu bar, select 'action' and then 'save'.
  4. Select destination for .ico file.

Reference : http://techsultan.com/how-to-extract-icons-from-windows-7/

Solution 8 - Windows

Here is an updated version of a solution above. I added a missing assembly that was buried in a link. Novices will not understand that. This is sample will run without modifications.

	<#
.SYNOPSIS
	Exports an ico and bmp file from a given source to a given destination
.Description
	You need to set the Source and Destination locations. First version of a script, I found other examples 
	but all I wanted to do as grab and ico file from an exe but found getting a bmp useful. Others might find useful
.EXAMPLE
	This will run but will nag you for input
    .\Icon_Exporter.ps1
.EXAMPLE
	this will default to shell32.dll automatically for -SourceEXEFilePath
	.\Icon_Exporter.ps1 -TargetIconFilePath 'C:\temp\Myicon.ico' -IconIndexNo 238
.EXAMPLE
	This will give you a green tree icon (press F5 for windows to refresh Windows explorer)
	.\Icon_Exporter.ps1 -SourceEXEFilePath 'C:/Windows/system32/shell32.dll' -TargetIconFilePath 'C:\temp\Myicon.ico' -IconIndexNo 41
	
.Notes
	Based on http://stackoverflow.com/questions/8435/how-do-you-get-the-icons-out-of-shell32-dll Version 1.1 2012.03.8
	New version: Version 1.2 2015.11.20 (Added missing custom assembly and some error checking for novices)
#>
Param ( 
	[parameter(Mandatory = $true)]
	[string] $SourceEXEFilePath = 'C:/Windows/system32/shell32.dll',
    [parameter(Mandatory = $true)]
	[string] $TargetIconFilePath,
	[parameter(Mandatory = $False)]
	[Int32]$IconIndexNo = 0
)

#https://social.technet.microsoft.com/Forums/windowsserver/en-US/16444c7a-ad61-44a7-8c6f-b8d619381a27/using-icons-in-powershell-scripts?forum=winserverpowershell
$code = @"
using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace System
{
	public class IconExtractor
	{

	 public static Icon Extract(string file, int number, bool largeIcon)
	 {
	  IntPtr large;
	  IntPtr small;
	  ExtractIconEx(file, number, out large, out small, 1);
	  try
	  {
	   return Icon.FromHandle(largeIcon ? large : small);
	  }
	  catch
	  {
	   return null;
	  }

	 }
	 [DllImport("Shell32.dll", EntryPoint = "ExtractIconExW", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
	 private static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons);

	}
}
"@

If  (-not (Test-path -Path $SourceEXEFilePath -ErrorAction SilentlyContinue ) ) {
	Throw "Source file [$SourceEXEFilePath] does not exist!"
}

[String]$TargetIconFilefolder = [System.IO.Path]::GetDirectoryName($TargetIconFilePath) 
If  (-not (Test-path -Path $TargetIconFilefolder -ErrorAction SilentlyContinue ) ) {
	Throw "Target folder [$TargetIconFilefolder] does not exist!"
}

Try {
	If ($SourceEXEFilePath.ToLower().Contains(".dll")) {
		Add-Type -TypeDefinition $code -ReferencedAssemblies System.Drawing
		$form = New-Object System.Windows.Forms.Form
	    $Icon = [System.IconExtractor]::Extract($SourceEXEFilePath, $IconIndexNo, $true)    
	} Else {
	    [void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")
	    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
	    $image = [System.Drawing.Icon]::ExtractAssociatedIcon("$($SourceEXEFilePath)").ToBitmap()
	    $bitmap = new-object System.Drawing.Bitmap $image
	    $bitmap.SetResolution(72,72)
	    $icon = [System.Drawing.Icon]::FromHandle($bitmap.GetHicon())
	}
} Catch {
	Throw "Error extracting ICO file"
}

Try {
	$stream = [System.IO.File]::OpenWrite("$($TargetIconFilePath)")
	$icon.save($stream)
	$stream.close()
} Catch {
	Throw "Error saving ICO file [$TargetIconFilePath]"
}
Write-Host "Icon file can be found at [$TargetIconFilePath]"

Solution 9 - Windows

There is also this resource available, the Visual Studio Image Library, which "can be used to create applications that look visually consistent with Microsoft software", presumably subject to the licensing given at the bottom. https://www.microsoft.com/en-ca/download/details.aspx?id=35825

Solution 10 - Windows

This question already has answers here, but for anybody new wondering how to do this, I used 7Zip and navigated to %SystemRoot%\system32\SHELL32.dll\.rsrc\ICON, then copied all the files to a desired location.

If you'd like a pre-extracted directory, you can download the ZIP here.

Note: I extracted the files on a Windows 8.1 installation, so they may vary from the ones on other versions of Windows.

Solution 11 - Windows

If you're on Linux, you can extract icons from a Windows DLL with gExtractWinIcons. It's available in Ubuntu and Debian in the gextractwinicons package.

This blog article has a screenshot and brief explanation.

Solution 12 - Windows

Not sure if I am 100% correct, but from my testing, the above options for using 7Zip or VS don't work on Windows 10 / 11 versions of imageres.dll or shell32.dll. This is the content I see:

[shell32.dll]
.rsrc\MANIFEST\124
.rsrc\MUI\1
.rsrc\TYPELIB\1
.rsrc\version.txt
.data
.didat
.pdata
.rdata
.reloc
.text
CERTIFICATE

Update: And I think I found why. Link to an article I found. (Sorry for being off-domain). You can find the resources in files in these locations:

"C:\Windows\SystemResources\shell32.dll.mun"
"C:\Windows\SystemResources\imageres.dll.mun"

Icons no longer in imageres.dll in Windows 10 1903 - 4kb file (superuser.com)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJay MooneyView Question on Stackoverflow
Solution 1 - WindowsAQNView Answer on Stackoverflow
Solution 2 - Windowsjm.View Answer on Stackoverflow
Solution 3 - WindowsOJ.View Answer on Stackoverflow
Solution 4 - WindowsShaunView Answer on Stackoverflow
Solution 5 - WindowsSteve CadwalladerView Answer on Stackoverflow
Solution 6 - WindowsMannyOView Answer on Stackoverflow
Solution 7 - WindowsJohnOconorView Answer on Stackoverflow
Solution 8 - WindowsMr. AnnoyedView Answer on Stackoverflow
Solution 9 - WindowsDavid CarrView Answer on Stackoverflow
Solution 10 - Windowsi Mr Oli iView Answer on Stackoverflow
Solution 11 - WindowsSmylersView Answer on Stackoverflow
Solution 12 - WindowsTheManInOzView Answer on Stackoverflow