OSDN Git Service

Move one more monkey patch into comtypesMonkeyPatches.
authorJames Teh <jamie@jantrid.net>
Thu, 10 Jan 2013 07:22:25 +0000 (17:22 +1000)
committerJames Teh <jamie@jantrid.net>
Thu, 10 Jan 2013 07:22:25 +0000 (17:22 +1000)
source/comtypesMonkeyPatches.py
source/core.py

index e061c97..1ba21e4 100644 (file)
@@ -3,6 +3,8 @@
 #This file is covered by the GNU General Public License.\r
 #See the file COPYING for more details.\r
 \r
+from logHandler import log\r
+\r
 #Monkey patch comtypes to support byref in variants\r
 from comtypes.automation import VARIANT, VT_BYREF\r
 from ctypes import cast, c_void_p\r
@@ -37,6 +39,21 @@ def new__call__(self,*args,**kwargs):
        return comtypes.client.dynamic.MethodCaller(0,self)(*args,**kwargs)\r
 comtypes.client.dynamic._Dispatch.__call__=new__call__\r
 \r
+# Work around an issue with comtypes where __del__ seems to be called twice on COM pointers.\r
+# This causes Release() to be called more than it should, which is very nasty and will eventually cause us to access pointers which have been freed.\r
+from comtypes import _compointer_base\r
+_cpbDel = _compointer_base.__del__\r
+def newCpbDel(self):\r
+       if hasattr(self, "_deleted"):\r
+               # Don't allow this to be called more than once.\r
+               log.debugWarning("COM pointer %r already deleted" % self)\r
+               return\r
+       _cpbDel(self)\r
+       self._deleted = True\r
+newCpbDel.__name__ = "__del__"\r
+_compointer_base.__del__ = newCpbDel\r
+del _compointer_base\r
+\r
 #Monkey patch to force dynamic Dispatch on all vt_dispatch variant values.\r
 #Certainly needed for comtypes COM servers, but currently very fiddly to do just for that case \r
 oldVARIANT_value_fget=VARIANT.value.fget\r
index a98dcfb..f056e56 100644 (file)
@@ -25,21 +25,6 @@ import globalVars
 from logHandler import log\r
 import addonHandler\r
 \r
-# Work around an issue with comtypes where __del__ seems to be called twice on COM pointers.\r
-# This causes Release() to be called more than it should, which is very nasty and will eventually cause us to access pointers which have been freed.\r
-from comtypes import _compointer_base\r
-_cpbDel = _compointer_base.__del__\r
-def newCpbDel(self):\r
-       if hasattr(self, "_deleted"):\r
-               # Don't allow this to be called more than once.\r
-               log.debugWarning("COM pointer %r already deleted" % self)\r
-               return\r
-       _cpbDel(self)\r
-       self._deleted = True\r
-newCpbDel.__name__ = "__del__"\r
-_compointer_base.__del__ = newCpbDel\r
-del _compointer_base\r
-\r
 def doStartupDialogs():\r
        import config\r
        import gui\r