Hello,

here are patches against pypy 1.5 so that comtypes works with it
(I hope it is acceptable to post patches here; I have no time to
learn mercurial at the moment).

Thanks,
Thomas
diff -x *.*~ -x *.orig -x *.pyc -ur 
c:\pypy-1.5.0a0-win32\lib_pypy/_ctypes/basics.py 
c:\pypy\lib_pypy/_ctypes/basics.py
--- c:\pypy-1.5.0a0-win32\lib_pypy/_ctypes/basics.py    Thu Mar 24 12:14:58 2011
+++ c:\pypy\lib_pypy/_ctypes/basics.py  Tue Jun 07 18:53:13 2011
@@ -123,7 +123,10 @@
         return buffer(self._buffer)
 
     def _get_b_base(self):
-        return self._base
+        try:
+            return self._base
+        except AttributeError:
+            return None
     _b_base_ = property(_get_b_base)
     _b_needsfree_ = False
 
diff -x *.*~ -x *.orig -x *.pyc -ur 
c:\pypy-1.5.0a0-win32\lib_pypy/_ctypes/function.py 
c:\pypy\lib_pypy/_ctypes/function.py
--- c:\pypy-1.5.0a0-win32\lib_pypy/_ctypes/function.py  Fri Apr 29 12:40:36 2011
+++ c:\pypy\lib_pypy/_ctypes/function.py        Thu Jun 09 13:50:00 2011
@@ -307,13 +307,13 @@
                     "native COM method call without 'this' parameter"
                     )
             thisarg = cast(args[0], POINTER(POINTER(c_void_p))).contents
-            argtypes = [c_void_p] + list(argtypes)
-            args = list(args)
-            args[0] = args[0].value
+            thisptr = c_void_p(args[0].value)
+            args, outargs = self._convert_args(argtypes, args[1:], kwargs)
+            args.insert(0, thisptr)
         else:
             thisarg = None
+            args, outargs = self._convert_args(argtypes, args, kwargs)
 
-        args, outargs = self._convert_args(argtypes, args, kwargs)
         argtypes = [type(arg) for arg in args]
 
         restype = self._restype_
@@ -366,6 +366,10 @@
         if not outargs:
             return result
 
+        simple_cdata = type(c_void_p()).__bases__[0]
+        outargs = [x.value if type(x).__bases__[0] is simple_cdata else x
+                   for x in outargs]
+
         if len(outargs) == 1:
             return outargs[0]
 
@@ -443,10 +447,7 @@
         total = len(args)
         paramflags = self._paramflags
 
-        if self._com_index:
-            inargs_idx = 1
-        else:
-            inargs_idx = 0
+        inargs_idx = 0
 
         if not paramflags and total < len(argtypes):
             raise TypeError("not enough arguments")
diff -x *.*~ -x *.orig -x *.pyc -ur 
c:\pypy-1.5.0a0-win32\lib_pypy/_ctypes/primitive.py 
c:\pypy\lib_pypy/_ctypes/primitive.py
--- c:\pypy-1.5.0a0-win32\lib_pypy/_ctypes/primitive.py Thu Mar 24 12:14:58 2011
+++ c:\pypy\lib_pypy/_ctypes/primitive.py       Thu Jun 09 13:49:15 2011
@@ -212,16 +212,18 @@
             result.value = property(_getvalue, _setvalue)
 
         elif tp == 'X':
-            from ctypes import windll
-            SysAllocStringLen = windll.oleaut32.SysAllocStringLen
-            SysStringLen = windll.oleaut32.SysStringLen
-            SysFreeString = windll.oleaut32.SysFreeString
+            # We must use WinDLL("oleaut32") instead of
+            # windll.oleaut32 because this creates a new instance of
+            # the loaded dll; and we want to have control over the
+            # argtypes and restype attribute of the exposed functions
+            from ctypes import WinDLL
+            oleaut32 = WinDLL("oleaut32")
             def _getvalue(self):
                 addr = self._buffer[0]
                 if addr == 0:
                     return None
                 else:
-                    size = SysStringLen(addr)
+                    size = oleaut32.SysStringLen(addr)
                     return _rawffi.wcharp2rawunicode(addr, size)
 
             def _setvalue(self, value):
@@ -230,11 +232,11 @@
                         value = value.decode(ConvMode.encoding,
                                              ConvMode.errors)
                     array = _rawffi.Array('u')(len(value)+1, value)
-                    value = SysAllocStringLen(array.buffer, len(value))
+                    value = oleaut32.SysAllocStringLen(array.buffer, 
len(value))
                 elif value is None:
                     value = 0
                 if self._buffer[0]:
-                    SysFreeString(self._buffer[0])
+                    oleaut.SysFreeString(self._buffer[0])
                 self._buffer[0] = value
             result.value = property(_getvalue, _setvalue)
 
diff -x *.*~ -x *.orig -x *.pyc -ur 
c:\pypy-1.5.0a0-win32\lib_pypy/_ctypes/__init__.py 
c:\pypy\lib_pypy/_ctypes/__init__.py
--- c:\pypy-1.5.0a0-win32\lib_pypy/_ctypes/__init__.py  Thu Mar 24 12:14:58 2011
+++ c:\pypy\lib_pypy/_ctypes/__init__.py        Thu Jun 09 13:26:36 2011
@@ -18,7 +18,14 @@
 if _os.name in ("nt", "ce"):
     from _rawffi import FormatError
     from _rawffi import check_HRESULT as _check_HRESULT
-    CopyComPointer = None # XXX
+    def CopyComPointer(src, dst):
+        from ctypes import c_void_p, cast
+        if src:
+            hr = src[0][0].AddRef(src)
+            if hr & 0x80000000:
+                return hr
+        dst[0] = cast(src, c_void_p).value
+        return 0
     LoadLibrary = dlopen
 
 from _rawffi import FUNCFLAG_STDCALL, FUNCFLAG_CDECL, FUNCFLAG_PYTHONAPI
_______________________________________________
pypy-dev mailing list
pypy-dev@python.org
http://mail.python.org/mailman/listinfo/pypy-dev

Reply via email to