Results 1 to 2 of 2

Thread: Extract Icons

  1. #1

    Thread Starter
    Lively Member
    Join Date
    Jun 1999
    Location
    East Anglia, England
    Posts
    73

    Post

    Hello,
    I am using the following code to extract icons from files and placing them in picture boxes, I then try to add that picture to a listimage but it keeps returning the following error "Out of Memory". Could someone please tell me how to fix this or possible a better way of doing it.

    ***Module Code***

    Option Explicit

    Private Type PicBmp
    Size As Long
    tType As Long
    hBmp As Long
    hPal As Long
    Reserved As Long
    End Type

    Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(7) As Byte
    End Type

    Private Declare Function OleCreatePictureIndirect _
    Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, _
    ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long

    Private Declare Function ExtractIconEx Lib "shell32.dll" _
    Alias "ExtractIconExA" (ByVal lpszFile As String, ByVal _
    nIconIndex As Long, phiconLarge As Long, phiconSmall As _
    Long, ByVal nIcons As Long) As Long

    Private Declare Function DestroyIcon Lib "user32" (ByVal _
    hicon As Long) As Long

    Public Function GetIconFromFile(FileName As String, _
    IconIndex As Long, UseLargeIcon As Boolean) As Picture

    'Parameters:
    'FileName - File (EXE or DLL) containing icons
    'IconIndex - Index of icon to extract, starting with 0
    'UseLargeIcon-True for a large icon, False for a small icon
    'Returns: Picture object, containing icon

    Dim hlargeicon As Long
    Dim hsmallicon As Long
    Dim selhandle As Long

    'IPicture requires a reference to "Standard OLE Types."
    Dim pic As PicBmp
    Dim IPic As IPicture
    Dim IID_IDispatch As GUID

    If ExtractIconEx(FileName, IconIndex, hlargeicon, _
    hsmallicon, 1) > 0 Then

    If UseLargeIcon Then
    selhandle = hlargeicon
    Else
    selhandle = hsmallicon
    End If

    'Fill in with IDispatch Interface ID.
    With IID_IDispatch
    .Data1 = &H20400
    .Data4(0) = &HC0
    .Data4(7) = &H46
    End With
    'Fill Pic with necessary parts.
    With pic
    .Size = Len(pic) 'Length of structure.
    .tType = vbPicTypeIcon 'Type of Picture (bitmap).
    .hBmp = selhandle 'Handle to bitmap.
    End With

    'Create Picture object.
    Call OleCreatePictureIndirect(pic, IID_IDispatch, 1, IPic)

    'Return the new Picture object.
    Set GetIconFromFile = IPic

    DestroyIcon hsmallicon
    DestroyIcon hlargeicon

    End If
    End Function

    ***File Code***

    Private Sub Form_Load()
    Set Picture1.Picture = GetIconFromFile("C:\WINDOWS\SYSTEM\SHELL32.DLL", 3, False)
    ImageList1.ListImages.Add 1, "Folder", Picture1.Picture
    End Sub

    Many Thanks.

  2. #2

    Thread Starter
    Lively Member
    Join Date
    Jun 1999
    Location
    East Anglia, England
    Posts
    73
    Come on, don't tell me no-one out there knows the answer to this.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width