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








_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to