I've lost some of the context here, but there is a pythoncom.ObjectFromAddress that looks like it does exactly what you want - check out the pywin32 docs for details...

HTH,

Mark

On 14/12/2012 11:04 AM, Gilles Baggieri wrote:
Mark Hammond <skippy.hammond <at> gmail.com> writes:


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
-----------------------------------------



Hello,

After spending several hours with the same problem (thanks for gdiplus.py, great
job!), I've found a solution from Thomas Heller's comtypes testunits. The idea
is to cast 'x' (pointer) to a comtypes POINTER(IUnknown), and then convert again
to pythoncom PyIDispatch.
Add this to the end of gdiplus LoadImage (but don't use buffer() as the returned
object can be return as is to RibbonX callback):


     ...
     if not x.value:
         return None

     from comtypes.automation import VARIANT, IUnknown, IDispatch
     from ctypes import cast, POINTER, PyDLL, py_object, c_void_p, byref
     from ctypes.wintypes import BOOL
     import pythoncom

     # cast to comtypes IUnknown
     cobj = cast(x,POINTER(IUnknown))

     # cast to PyIDispatch
     _PyCom_PyObjectFromIUnknown =
PyDLL(pythoncom.__file__).PyCom_PyObjectFromIUnknown
     _PyCom_PyObjectFromIUnknown.restype = py_object
     _PyCom_PyObjectFromIUnknown.argtypes = (POINTER(IUnknown), c_void_p, BOOL)

     return _PyCom_PyObjectFromIUnknown(cobj, byref(IDispatch._iid_), True)


Perhaps is there a shorter (and clearer!) way...

Gilles


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


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

Reply via email to