Jump to content
Sign in to follow this  
Zohran

icon help

Recommended Posts

Zohran

how can i know that wheather a 64x64 icon is present in a dll file.

for example a folder icon of index 3 in shell32.dll . how would i know that a 64x64 pixel format of that icon is in that dll

Share this post


Link to post
Share on other sites
Yashied

Not so easy.

#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

Global Const $tagICONRESDIR = 'byte Width;byte Height;byte ColorCount;byte Reserved;ushort Planes;ushort BitCount;dword BytesInRes;ushort IconId;'
Global Const $tagNEWHEADER = 'ushort Reserved;ushort ResType;ushort ResCount;' ; & $tagICONRESDIR[ResCount]
Global Const $tagIHDR = 'dword Width;dword Height;byte BitDepth;byte ColorType;byte CompressionMethod;byte FilterMethod;byte InterlaceMethod'

$hInstance = _WinAPI_LoadLibraryEx(@SystemDir & 'imageres.dll', $LOAD_LIBRARY_AS_DATAFILE)
$hResource = _WinAPI_FindResource($hInstance, $RT_GROUP_ICON, 3)
$hData = _WinAPI_LoadResource($hInstance, $hResource)
$pData = _WinAPI_LockResource($hData)

$tHdr = DllStructCreate($tagNEWHEADER, $pData)
$Count = DllStructGetData($tHdr, 'ResCount')
For $i = 1 To $Count
    $tResDir = DllStructCreate($tagICONRESDIR, $pData + 6 + 14 * ($i - 1))
    $hResource = _WinAPI_FindResource($hInstance, $RT_ICON, DllStructGetData($tResDir, 'IconId'))
    $hInfo = _WinAPI_LoadResource($hInstance, $hResource)
    $pIcon = _WinAPI_LockResource($hInfo)
    If DllStructGetData(DllStructCreate('byte[8]', $pIcon), 1) = Binary('0x89504E470D0A1A0A') Then
        ; PNG => Retrieve IHDR chunk data (always first chunk, offset = 8)
        $tHdr = DllStructCreate($tagIHDR, $pIcon + 16)
        $Width = _WinAPI_SwapDWord(DllStructGetData($tHdr, 'Width'))
        $Height = _WinAPI_SwapDWord(DllStructGetData($tHdr, 'Height'))
        $Png = ' (PNG)'
    Else
        ; ICO => Retrieve BITMAPINFOHEADER structure
        $tHdr = DllStructCreate($tagBITMAPINFOHEADER, $pIcon)
        $Width = DllStructGetData($tHdr, 'biWidth')
        $Height = DllStructGetData($tHdr, 'biHeight') / 2
        $Png = ''
    EndIf
    ConsoleWrite($Width & ' x ' & $Height & ', ' & DllStructGetData($tResDir, 'BitCount') & 'bpp' & $Png & @CR)
Next

_WinAPI_FreeLibrary($hInstance)
Edited by Yashied
  • Like 1

Share this post


Link to post
Share on other sites
Zohran

Not so easy.

#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

Global Const $tagICONRESDIR = 'byte Width;byte Height;byte ColorCount;byte Reserved;ushort Planes;ushort BitCount;dword BytesInRes;ushort IconId;'
Global Const $tagNEWHEADER = 'ushort Reserved;ushort ResType;ushort ResCount;' ; & $tagICONRESDIR[ResCount]
Global Const $tagIHDR = 'dword Width;dword Height;byte BitDepth;byte ColorType;byte CompressionMethod;byte FilterMethod;byte InterlaceMethod'

$hInstance = _WinAPI_LoadLibraryEx(@SystemDir & 'imageres.dll', $LOAD_LIBRARY_AS_DATAFILE)
$hResource = _WinAPI_FindResource($hInstance, $RT_GROUP_ICON, 3)
$hData = _WinAPI_LoadResource($hInstance, $hResource)
$pData = _WinAPI_LockResource($hData)

$tHdr = DllStructCreate($tagNEWHEADER, $pData)
$Count = DllStructGetData($tHdr, 'ResCount')
For $i = 1 To $Count
    $tResDir = DllStructCreate($tagICONRESDIR, $pData + 6 + 14 * ($i - 1))
    $hResource = _WinAPI_FindResource($hInstance, $RT_ICON, DllStructGetData($tResDir, 'IconId'))
    $hInfo = _WinAPI_LoadResource($hInstance, $hResource)
    $pIcon = _WinAPI_LockResource($hInfo)
    If DllStructGetData(DllStructCreate('byte[8]', $pIcon), 1) = Binary('0x89504E470D0A1A0A') Then
        ; PNG => Retrieve IHDR chunk data (always first chunk, offset = 8)
        $tHdr = DllStructCreate($tagIHDR, $pIcon + 16)
        $Width = _WinAPI_SwapDWord(DllStructGetData($tHdr, 'Width'))
        $Height = _WinAPI_SwapDWord(DllStructGetData($tHdr, 'Height'))
        $Png = ' (PNG)'
    Else
        ; ICO => Retrieve BITMAPINFOHEADER structure
        $tHdr = DllStructCreate($tagBITMAPINFOHEADER, $pIcon)
        $Width = DllStructGetData($tHdr, 'biWidth')
        $Height = DllStructGetData($tHdr, 'biHeight') / 2
        $Png = ''
    EndIf
    ConsoleWrite($Width & ' x ' & $Height & ', ' & DllStructGetData($tResDir, 'BitCount') & 'bpp' & $Png & @CR)
Next

_WinAPI_FreeLibrary($hInstance)

works perfect . thanks yashied.

Share this post


Link to post
Share on other sites
Zohran

Not so easy.

#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

Global Const $tagICONRESDIR = 'byte Width;byte Height;byte ColorCount;byte Reserved;ushort Planes;ushort BitCount;dword BytesInRes;ushort IconId;'
Global Const $tagNEWHEADER = 'ushort Reserved;ushort ResType;ushort ResCount;' ; & $tagICONRESDIR[ResCount]
Global Const $tagIHDR = 'dword Width;dword Height;byte BitDepth;byte ColorType;byte CompressionMethod;byte FilterMethod;byte InterlaceMethod'

$hInstance = _WinAPI_LoadLibraryEx(@SystemDir & 'imageres.dll', $LOAD_LIBRARY_AS_DATAFILE)
$hResource = _WinAPI_FindResource($hInstance, $RT_GROUP_ICON, 3)
$hData = _WinAPI_LoadResource($hInstance, $hResource)
$pData = _WinAPI_LockResource($hData)

$tHdr = DllStructCreate($tagNEWHEADER, $pData)
$Count = DllStructGetData($tHdr, 'ResCount')
For $i = 1 To $Count
    $tResDir = DllStructCreate($tagICONRESDIR, $pData + 6 + 14 * ($i - 1))
    $hResource = _WinAPI_FindResource($hInstance, $RT_ICON, DllStructGetData($tResDir, 'IconId'))
    $hInfo = _WinAPI_LoadResource($hInstance, $hResource)
    $pIcon = _WinAPI_LockResource($hInfo)
    If DllStructGetData(DllStructCreate('byte[8]', $pIcon), 1) = Binary('0x89504E470D0A1A0A') Then
        ; PNG => Retrieve IHDR chunk data (always first chunk, offset = 8)
        $tHdr = DllStructCreate($tagIHDR, $pIcon + 16)
        $Width = _WinAPI_SwapDWord(DllStructGetData($tHdr, 'Width'))
        $Height = _WinAPI_SwapDWord(DllStructGetData($tHdr, 'Height'))
        $Png = ' (PNG)'
    Else
        ; ICO => Retrieve BITMAPINFOHEADER structure
        $tHdr = DllStructCreate($tagBITMAPINFOHEADER, $pIcon)
        $Width = DllStructGetData($tHdr, 'biWidth')
        $Height = DllStructGetData($tHdr, 'biHeight') / 2
        $Png = ''
    EndIf
    ConsoleWrite($Width & ' x ' & $Height & ', ' & DllStructGetData($tResDir, 'BitCount') & 'bpp' & $Png & @CR)
Next

_WinAPI_FreeLibrary($hInstance)

its not working for .ico files

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×