Zohran Posted March 17, 2012 Posted March 17, 2012 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
Yashied Posted March 17, 2012 Posted March 17, 2012 (edited) 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 March 17, 2012 by Yashied Zohran 1 My UDFs: iKey | FTP Uploader | Battery Checker | Boot Manager | Font Viewer | UDF Keyword Manager | Run Dialog Replacement | USBProtect | 3D Axis | Calculator | Sleep | iSwitcher | TM | NetHelper | File Types Manager | Control Viewer | SynFolders | DLL Helper Animated Tray Icons UDF Library | Hotkeys UDF Library | Hotkeys Input Control UDF Library | Caret Shape UDF Library | Context Help UDF Library | Most Recently Used List UDF Library | Icons UDF Library | FTP UDF Library | Script Communications UDF Library | Color Chooser UDF Library | Color Picker Control UDF Library | IPHelper (Vista/7) UDF Library | WinAPI Extended UDF Library | WinAPIVhd UDF Library | Icon Chooser UDF Library | Copy UDF Library | Restart UDF Library | Event Log UDF Library | NotifyBox UDF Library | Pop-up Windows UDF Library | TVExplorer UDF Library | GuiHotKey UDF Library | GuiSysLink UDF Library | Package UDF Library | Skin UDF Library | AITray UDF Library | RDC UDF Library Appropriate path | Button text color | Gaussian random numbers | Header's styles (Vista/7) | ICON resource enumeration | Menu & INI | Tabbed string size | Tab's skin | Pop-up circular menu | Progress Bar without animation (Vista/7) | Registry export | Registry path jumping | Unique hardware ID | Windows alignment More...
Zohran Posted March 18, 2012 Author Posted March 18, 2012 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.
Zohran Posted March 18, 2012 Author Posted March 18, 2012 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now