[python-win32] Extract icon from exe files

Tim Roberts timr at probo.com
Thu Apr 30 20:10:03 CEST 2009


Nicolas EISEN wrote:
> Tim Roberts a écrit :
>> EISEN Nicolas wrote:
>>  
>>>>  
>>>>       
>>> I'm lucky, I found ...
>>>
>>> My Source :
>>>
>>>   /from win32gui import *
>>>   import win32con
>>>   from pywintypes import HANDLE
>>>    import win32ui   listHicon = ExtractIconEx("c:\OpenOffice.exe",0)
>>>   tupleIcon = GetIconInfo (HANDLE ( listHicon[0][0] ) )
>>>
>>>   bitmapColor = tupel [4]
>>>
>>>    picture = win32ui.CreateBitmap()
>>>   buffer = picture.GetBitmapBits ( bitmapColor )
>>> /
>>>
>>> Python return :
>>> /win32ui.error: GetObject failed on bitmap/
>>> for the last line
>>>
>>> win32ui have CreateBitmap with 0 argument and GetBitmapBits with 1
>>> arguments
>>> but win32gui have CreateBitmap with 5 arguments and GetBitmapBits have
>>> 2 arguments
>>>     
>>
>> Yes.  Can't you see why?  win32gui is just a thin wrapper around the
>> actual Win32 APIs.  win32ui is an attempt to turn those APIs into
>> something more like Python objects.  Objects have access to additional
>> state, so you don't have to specify as many parameters.  When you call
>>     picture.GetBitmapBits( bitmapColor )
>>
>> That's getting the pixels from the bitmap you just created.  The
>> parameter it takes is the number of bytes is should copy (so you're
>> passing garbage).  Your bitmap doesn't contain anything yet -- you
>> haven't even set the size -- so naturally the GetBitmapBits call fails.
>>
>> You need to do EXACTLY what the demo does.  Create a bitmap, set its
>> size, then draw the icon on the bitmap, THEN pull the bits from the
>> bitmap.  The icon doesn't actually contain bitmaps.  It contains arrays
>> of pixels, but you need them to be a bitmap.
>>
>>
>>  
>>> On the demo, hicon is use ton create the variable nid and re use it to
>>> display on the screen, but i want get only the bitmap bits.
>>>     
>>
>> I'm not sure why you think these two things are different.  The way you
>> get the bitmap bits is to draw the icon on a bitmap.
>>
>>   
>
> With demo_menu, I script it :
>
>    /from win32gui import */
>    /import win32con/
>    /from win32api import GetSystemMetrics/
>
>
>    /ico_x = GetSystemMetrics(win32con.SM_CXSMICON)/
>    /ico_y = GetSystemMetrics(win32con.SM_CYSMICON)/
>
>    /large, small = ExtractIconEx("c:\dxdiag.exe",0)/
>    /hicon = small[0]/
>    /print type(hicon)/
>    /DestroyIcon(large[0])/
>
>    /#creating a source memory DC and selecting a icon in it/
>    /srcDC = CreateCompatibleDC(0)/
>    /SelectObject(srcDC,hicon);/
>
>    /#creating a destination memory DC and selecting a memory bitmap to
> it/
>    /hdcBitmap = CreateCompatibleDC(0)/
>    /hdcScreen = GetDC(0)/
>    /hbm = CreateCompatibleBitmap(hdcScreen, ico_x, ico_y)/
>    /SelectObject(hdcBitmap, hbm)/
>
>    /# copies source DC to memory DC resulting in a copy of hicon in hbm/
>    /BitBlt(hdcBitmap,0,0,ico_x,ico_y,srcDC,0,0,win32con.SRCCOPY);/
>
>    /bitmap = CreateBitmapFromHandle(hbm)/
>    /hbm.SaveBitmapFile()/
>
>    /DeleteDC(srcDC);/
>    /DeleteDC(hdcBitmap);
>    /
>
>
> I suppose, I have my icon picture on the Bitmap /hbm/ but how I get
> file's bits or how I save it ?
>
> There are SaveBitmapFile or GetBitmapBits methods on win32ui
> (PyCBitmap) but I test many disposition, I have always type problem
> between win32gui and win32ui objects.
> I try to use win32gui DC with icon and win32ui DC with bitmap, but
> always the type doesn't work : PyHandle (win32gui) is different from
> PyBitmap (win32ui).
>
> Please Help ! I 'm tired ...

I think you're making this a lot harder than it needs to be.

    import win32ui
    import win32gui
    import win32con
    import win32api

    ico_x = win32api.GetSystemMetrics(win32con.SM_CXICON)
    ico_y = win32api.GetSystemMetrics(win32con.SM_CYICON)

    large, small =
    win32gui.ExtractIconEx("c:/windows/system32/shell32.dll",0)
    win32gui.DestroyIcon(large[0])

    hdc = win32ui.CreateDCFromHandle( win32gui.GetDC(0) )
    hbmp = win32ui.CreateBitmap()
    hbmp.CreateCompatibleBitmap( hdc, ico_x, ico_x )
    hdc = hdc.CreateCompatibleDC()

    hdc.SelectObject( hbmp )
    hdc.DrawIcon( (0,0), small[0] )
    hbmp.SaveBitmapFile( hdc, "save.bmp" )

-- 
Tim Roberts, timr at probo.com
Providenza & Boekelheide, Inc.



More information about the python-win32 mailing list