[python-win32] a question about word addin , IRibbonExtensibility, GetCustomUI, getImage, IPicture

Mark Hammond skippy.hammond at gmail.com
Sun Mar 25 14:27:39 CEST 2012


I'm not familiar enough with ctypes to know if that makes sense, but I 
doubt it - nothing would seem to know the size of the buffer pointed at 
by 'x'.  You probably need to stick with using a python string object - 
ensure the string contains exactly the bytes of the metafile.

Mark

On 25/03/2012 10:33 PM, shuwj wrote:
>
>> I believe a c_void_p is a ctypes construct which aren't supported by
>> pywin32.  You need to convert it to a "normal" Python type.  I'm
>> guessing it is binary data, so in py2k, you should be able to simply use
>> buffer(some_string_object).  The error message seems to imply you may
>> even be able to use buffer(c_void_p_object), but I don't know how they
>> work well enough to suggest that will actually work.
>>
>> Mark
>>
>
> Hi Mark,
> Thanks for your reply. I use buffer() in GetImage method and there's no
> exception now,  but they don't work as expected.
>
>
> -----------------------------------------
> class wordaddin:
>      def GetImage(self,ctrl):
>          from gdiplus import LoadImage
>          i = LoadImage( 'c:/edit.png' )
>          i = buffer(i)
>          print i, 'ddd'
>          return i
> -----------------------------------------
>
>
> gdiplus.py  is as following:
> -----------------------------------------
> #coding: gbk
>
> from ctypes import *
> from ctypes.wintypes import *
> from comtypes import GUID
>
> oleaut32 = windll.oleaut32
> gdiplus = windll.gdiplus
>
>
> class GdiplusStartupInput(Structure):
>      _fields_ = [
>          ('GdiplusVersion', c_uint32),
>          ('DebugEventCallback', c_void_p),
>          ('SuppressBackgroundThread', BOOL),
>          ('SuppressExternalCodecs', BOOL)
>      ]
>
> class GdiplusStartupOutput(Structure):
>      _fields = [
>          ('NotificationHookProc', c_void_p),
>          ('NotificationUnhookProc', c_void_p)
>      ]
>
>
> class PicDesc(Structure):
>      _fields_ = [
>          ('Size', UINT),
>          ('Type', UINT),
>          ('hPic', HBITMAP),
>          ('hPal', HPALETTE)
>      ]
>
> PICTYPE_BITMAP = 1
>
> def LoadImage(filename):
>      '''Load an image from a file.
>      '''
>
>      #Initaialize GDI+
>      token = c_ulong()
>      startup_in = GdiplusStartupInput()
>      startup_in.GdiplusVersion = 1
>      startup_out = GdiplusStartupOutput()
>      u = gdiplus.GdiplusStartup( byref(token), byref(startup_in), byref(startup_out))
>
>      fname = LPOLESTR( filename )
>      bitmap = c_void_p()
>      gdiImage = c_void_p()
>      x = LPVOID()
>
>      if u == 0:
>          print u
>          #Load the image
>          v = gdiplus.GdipCreateBitmapFromFile( fname, byref(gdiImage) )
>          if v == 0:
>              print v
>
>              #Create a bitmap handle from the GDI image
>              gdiplus.GdipCreateHBITMAPFromBitmap( gdiImage, byref(bitmap), 0 )
>
>              #Create the IPicture object from the bitmap handle
>              IID_IPicture = GUID('{7BF80980-BF32-101A-8BBB-00AA00300CAB}' )
>              picinfo = PicDesc( Type=PICTYPE_BITMAP, hPic=bitmap, hPal=0  )
>              picinfo.Size = picinfo.__sizeof__()
>
>              print oleaut32.OleCreatePictureIndirect( byref(picinfo), byref(IID_IPicture), True, byref(x) )
>
>              gdiplus.GdipDisposeImage( gdiImage)
>
>          gdiplus.GdiplusShutdown( token )
>
>
>      return x
>
>
>
>
>
>




More information about the python-win32 mailing list