Extract TreeView or ListView ImageList icons from a DLL

An ImageList can be used for a ListView or TreeView control to contain many images in a single file, usually embedded as a resource. Visual Studio itself has many icons.

If you open Windows Explorer or Internet Explorer, you can see many icons in toolbars, ListViews or TreeViews.

Using Visual Studio (any version), choose File->Open->File and navigate to C:\Windows\System32\shdocvw.dll. The file will be opened by default in the Resource editor, and you can drill down into the resources embedded in the dll. Drill down into Bitmap and double-click on 328 (xp) or 3215 (Vista). A single bitmap is displayed, made up of many smaller bitmaps placed in a row.

Below is code that will extract individual icons from such resources. It loads a DLL, loads the desired resource, creates a Managed BitMap object and uses it do display the icons in a ListView.

The Bitmap.FromHbitmap(hRes) function will take a resource and convert it into a managed BitMap, which can be used as a ListView and also Saved as an individual file.

You can use GetManifestResourceNames to get resources from a managed assembly.

Start Visual Studio (any version), then choose File->New->Project->Windows Forms Application, then dbl click the form and replace the code with this sample. Then hit F5 to run it.

Imports System.Runtime.InteropServices

Public Class Form1

    Const LOAD_LIBRARY_AS_IMAGE_RESOURCE = &H20

    Const LOAD_LIBRARY_AS_DATAFILE = 2

    <DllImport("kernel32.dll")> _

    Shared Function LoadLibraryEx(ByVal lpFilename As String, ByVal hModule As IntPtr, ByVal dwFlags As UInteger) As IntPtr

    End Function

    <DllImport("user32.dll")> _

    Shared Function LoadBitmap(ByVal hModule As IntPtr, ByVal hResInfo As UInteger) As IntPtr

    End Function

    <DllImport("kernel32.dll")> _

    Shared Function FreeLibrary(ByVal hModule As IntPtr) As IntPtr

    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.Width = 600

       Me.Height = 600

        Dim lv As New ListView

        lv.Height = Me.Width

        lv.Width = Me.Height

        'C:\Windows\System32\shdocvw.dll, 328

        'C:\Windows\System32\browseui.dll 279

        Dim hModule = LoadLibraryEx("C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\msenv.dll", _

                                    0, LOAD_LIBRARY_AS_IMAGE_RESOURCE + LOAD_LIBRARY_AS_DATAFILE)

        Dim hRes = LoadBitmap(hModule, &H4F4)

        Dim bmpIcons = Bitmap.FromHbitmap(hRes)

        bmpIcons.Save("d:\t.bmp") 'optionally save it to inspect it

        FreeLibrary(hModule)

        Me.Controls.Add(lv)

        lv.View = View.SmallIcon

        Dim imlist As New ImageList

        'imlist.ImageSize = New Drawing.Size(16, 16)

        'imlist.ColorDepth = ColorDepth.Depth24Bit

        imlist.TransparentColor = Color.FromArgb(&HFFFF00FF)

        imlist.Images.AddStrip(bmpIcons)

        lv.SmallImageList = imlist

        For i = 0 To 235

            lv.Items.Add(i.ToString, i)

           Dim icon = imlist.Images.Item(i)

            icon.Save("d:\OMBmp" + i.ToString + ".bmp") 'save individual icons

        Next

    End Sub

End Class