Hi Thomas,
In NVDA, we sometimes see access violation and vtable errors in __del__
on comtypes COM POINTER objects and intermittant crashes. I eventually
figured that this might relate to Release() being called too many times.
I then discovered that __del__ on these objects is sometimes called more
than once. (We never call __del__ ourselves, so this is happening
elsewhere.) As I understand it, Python should only ever call it once.
I discovered this using the following rather nasty monkey patch before
any COM objects are used:
from comtypes import _compointer_base
_cpbDel = _compointer_base.__del__
def newCpbDel(self):
assert not hasattr(self, "_deleted"), "compointer already deleted"
_cpbDel(self)
self._deleted = True
newCpbDel.__name__ = "__del__"
_compointer_base.__del__ = newCpbDel
del _compointer_base
This assertion does get raised. While I have come up with an exact set
of steps to reproduce with NVDA and Firefox, I haven't yet managed to
narrow it down to a programmatic test case due to the sheer number of
interactions and code paths. I can tell you that we use QueryInterface
quite a bit if that helps in any way.
Can you think of any reason this might be happening? Is there any code
in the ctypes POINTER type that calls __del__?
Thanks.
Jamie
--
James Teh
Email/MSN Messenger/Jabber: [email protected]
Web site: http://www.jantrid.net/
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
comtypes-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/comtypes-users