[python-win32] Passing Nothing into ReferencesEvents - resolved, however can't bind events
shivisi
shivisi at nana10.co.il
Sun Oct 18 08:42:03 CEST 2009
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:mhammond at skippinet.com.au]
Sent: Sun 10/18/2009 02:54
To: shivisi
Cc: python-win32 at 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.hammond at gmail.com]
> > Sent: Fri 10/16/2009 02:00
> > To: shivisi
> > Cc: python-win32 at 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 at python.org
> >>> http://mail.python.org/mailman/listinfo/python-win32
> >
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-win32/attachments/20091018/6bccfb3c/attachment-0001.htm>
More information about the python-win32
mailing list