IDispatch is not supported. I have an issue using comtypes, which I have already resolved using pywin32. I need to pass Nothing (or the equivalent) into acc.VBE.Events.ReferencesEvents Under pywin32, I pass None, and that works. What is the equivalent of Nothing in comtypes?
-----Original Message----- From: Mark Hammond [mailto:mhamm...@skippinet.com.au] Sent: Sun 10/18/2009 02:54 To: shivisi Cc: python-win32@python.org Subject: Re: [python-win32] Passing Nothing into ReferencesEvents - resolved, however can't bind events On 18/10/2009 6:30 AM, shivisi wrote: > Thanks for taking the time to answer, and for pywin. I've been using > pywin with COM for some time, and am only now (when something doesn't > "just work") starting to appreciate its internal complexities. > > I get back the following error: > >>> com_error: (-2147467262, 'No such interface supported', None, None) > I have a very sketchy understanding of COM's internals, but if the > IDispatch interface was supported, wouldn't Dispatch() be using that? > Also, is there any way of getting the interfaces which an object does > support? Hrm - IDispatch not being supported makes things a little tricker. It would be interesting to know if: ti = acc.VBE.Events.ReferencesEvents(None).QueryInterface(pythoncom.IID_ITypeInfo) works? If so, we can possibly convince DispatchWithEvents to work with the object. If not, then you may find comtypes is the way to go... Cheers, Mark > disp = > acc.VBE.Events.ReferencesEvents(None).QueryInterface(pythoncom.IID_IDispatch) > refsEvents=DispatchWithEvents(disp,RefEvents) > > To ensure we are passing an IDispatch rather than an IUnknown to > DispatchWithEvents. > > HTH, > > Mark > > > > On 16/10/2009 7:32 PM, shivisi wrote: > > I'm confused. > > > > DispatchWithEvents fails on Access.Application, because there are no > events on that object. > > The events of interest are on the associated VB Editor/VB Project, > via the VBA Extensibility Library. VBE is the root object of that > library, and that is the type of acc.VBE. > > These events are retrieved with the whole path: > >>>> acc.VBE.Events.ReferencesEvents(None) > > where acc is the Access.Application object. > > > > If the Access.Application did have events, would > win32com.PumpMessages() return events for all the child objects? > > If it does, then perhaps I can use: > >>>> DispatchWithEvents(acc.VBE.Events,RefEvents) > >>>> win32com.PumpMessages() > > However, ReferencesEvents is a "property with arguments", and needs > to be passed None. > > > > It seems that ReferencesEvents(None) returns a PyIUnknown object, and > DispatchWithEvents can only bind to (at a minimum) PyIDispatch. Would > comtypes help me here? > > > > -----Original Message----- > > From: Mark Hammond [mailto:skippy.hamm...@gmail.com] > > Sent: Fri 10/16/2009 02:00 > > To: shivisi > > Cc: python-win32@python.org > > Subject: Re: [python-win32] Passing Nothing into ReferencesEvents - > resolved, however can't bind events > > > > On 15/10/2009 10:50 PM, shivisi wrote: > >> Passing Application.VBE.Events.ReferencesEvents(None) works (at > least at this point). > >> However, when I try to bind to an event class, I get the error below. > >> Any assistance, debugging suggestions, would be greatly appreciated. > >> Thanks. > >> > >> # Code > >> from win32com.client import Dispatch, DispatchWithEvents, getevents > >> > >> class RefEvents: > >> def OnItemAdded(self,ref): > >> print '--Event - Reference added' > >> def OnItemRemoved(self,ref): > >> print '--Event - Reference removed' > >> > >> acc=Dispatch('Access.Application') > >> acc.Visible=True > >> > refsEvents=DispatchWithEvents(acc.VBE.Events.ReferencesEvents(None),RefEvents) > > > > > > See the docstring for DispatchWithEvents - you probably want something > > closer to: > > > > acc = DispatchWithEvents('Access.Application', RefEvents) > > acc.Visible = True > > win32com.PumpMessages() # sit here doing nothing but waiting for > events... > > > > Cheers, > > > > Mark > > > > > >> > #----------------------------------------------------------------------------- > >> Traceback (most recent call last): > >> File "<interactive input>", line 1, in<module> > >> File "C:\Python26\lib\site-packages\win32com\client\__init__.py", > line 245, in DispatchWithEvents > >> disp = Dispatch(clsid) > >> File "C:\Python26\lib\site-packages\win32com\client\__init__.py", > line 96, in Dispatch > >> return __WrapDispatch(dispatch, userName, resultCLSID, typeinfo, > clsctx=clsctx) > >> File "C:\Python26\lib\site-packages\win32com\client\__init__.py", > line 43, in __WrapDispatch > >> return dynamic.Dispatch(dispatch, userName, WrapperClass, typeinfo, > clsctx=clsctx) > >> File "C:\Python26\lib\site-packages\win32com\client\dynamic.py", > line 118, in Dispatch > >> typeinfo = IDispatch.GetTypeInfo() > >> AttributeError: 'PyIUnknown' object has no attribute 'GetTypeInfo' > >> > #----------------------------------------------------------------------------- > >>>>> acc.VBE.Events.ReferencesEvents > >> <bound method Events.ReferencesEvents of<win32com.gen_py.Microsoft > Visual Basic for Applications Extensibility 5.3.Events instance at > 0x17466752>> > >>>>> acc.VBE.Events.ReferencesEvents(None) > >> <PyIUnknown at 0x0102CFF8 with obj at 0x00190AEC> > >> > >> > >> Original message: > >>> I am writing a COM addin, and attempting to trap the > ItemAdded/ItemRemoved event in the following object: > >>> Application.VBE.Events.ReferencesEvents > >>> which is retrieved by passing Nothing as a paramter: > >>> Application.VBE.Events.ReferencesEvents(Nothing) > >>> > >>> Tim Golden wrote in the following post > (http://mail.python.org/pipermail/python-win32/2009-February/008826.html) that > pythoncom.Empty can be used for Nothing. However, when trying this: > >>> > >>> try: > >>> self.comRefevents=self.app.VBE.Events.ReferencesEvents(pythoncom.Empty) > >>> except pythoncom.com_error, (hr, msg, exc, arg): > >>> print "The call failed with code %d: %s" % (hr, msg) > >>> if exc is None: > >>> print "There is no extended error information" > >>> else: > >>> wcode, source, text, helpFile, helpId, scode = exc > >>> print "The source of the error is", source > >>> print "The error message is", text > >>> print "More info can be found in %s (id=%d)" % (helpFile, helpId) > >>> > >>> I get back the following (the same as if I had passed no arguments > at all): > >>> > >>> The call failed with code -2147352561: Parameter not optional. > >>> There is no extended error information > >>> > >>> Eric Lippert states in his blog > (http://blogs.msdn.com/ericlippert/archive/2004/07/14/183241.aspx): > >>>> A common alternative to passing a missing argument is to pass > Nothing, Null, or Empty in VBScript, > >>>> null or undefined in JScript. Null and null pass VT_NULL, Empty > and undefined pass VT_EMPTY, and > >>>> Nothing passes a VT_DISPATCH with no value dispatch object pointer. > >>> It would seem that VB's Nothing and Empty are two different things. > >>> > >>> If I try passing pythoncom.VT_DISPATCH, then I get the following > traceback: > >>> > >>> > ----------------------------------------------------------------------------------------------------------- > >>> Traceback (most recent call last): > >>> File "C:\Python26\lib\site-packages\win32com\universal.py", line > 177, in dispatch > >>> retVal = ob._InvokeEx_(meth.dispid, 0, meth.invkind, args, None, None) > >>> File "C:\Python26\lib\site-packages\win32com\server\policy.py", > line 324, in _InvokeEx_ > >>> return self._invokeex_(dispid, lcid, wFlags, args, kwargs, > serviceProvider) > >>> File "C:\Python26\lib\site-packages\win32com\server\policy.py", > line 649, in _invokeex_ > >>> return DesignatedWrapPolicy._invokeex_( self, dispid, lcid, wFlags, > args, kwArgs, serviceProvider) > >>> File "C:\Python26\lib\site-packages\win32com\server\policy.py", > line 585, in _invokeex_ > >>> return func(*args) > >>> File "C:\Documents and Settings\ABG7\My > Documents\Zevi\Python-COMAddin\VBACodeRepository.py", line 104, in > OnConnection > >>> > self.comRefevents=self.app.VBE.Events.ReferencesEvents(pythoncom.VT_DISPATCH) > >>> File > "C:\Python26\lib\site-packages\win32com\gen_py\0002E157-0000-0000-C000-000000000046x0x5x3.py", > line 145, in ReferencesEvents > >>> ret = self._oleobj_.InvokeTypes(202, LCID, 2, (13, 0), ((13, > 1),),VBProject > >>> TypeError: The Python instance can not be converted to a COM object > >>> pythoncom error: Unexpected gateway error > >>> > >>> Traceback (most recent call last): > >>> File "C:\Python26\lib\site-packages\win32com\universal.py", line > 177, in dispatch > >>> retVal = ob._InvokeEx_(meth.dispid, 0, meth.invkind, args, None, None) > >>> File "C:\Python26\lib\site-packages\win32com\server\policy.py", > line 324, in _InvokeEx_ > >>> return self._invokeex_(dispid, lcid, wFlags, args, kwargs, > serviceProvider) > >>> File "C:\Python26\lib\site-packages\win32com\server\policy.py", > line 649, in _invokeex_ > >>> return DesignatedWrapPolicy._invokeex_( self, dispid, lcid, wFlags, > args, kwArgs, serviceProvider) > >>> File "C:\Python26\lib\site-packages\win32com\server\policy.py", > line 585, in _invokeex_ > >>> return func(*args) > >>> File "C:\Documents and Settings\ABG7\My > Documents\Python-COMAddin\VBACodeRepository.py", line 104, in OnConnection > >>> > self.comRefevents=self.app.VBE.Events.ReferencesEvents(pythoncom.VT_DISPATCH) > >>> File > "C:\Python26\lib\site-packages\win32com\gen_py\0002E157-0000-0000-C000-000000000046x0x5x3.py", > line 145, in ReferencesEvents > >>> ret = self._oleobj_.InvokeTypes(202, LCID, 2, (13, 0), ((13, > 1),),VBProject > >>> TypeError: The Python instance can not be converted to a COM object > >>> > >>> > >>> _______________________________________________ > >>> 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