[python-win32] Passing Nothing into ReferencesEvents - resolved, however can't bind events

Mark Hammond mhammond at skippinet.com.au
Sun Oct 18 02:54:10 CEST 2009


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
>  >
>  >
>
>



More information about the python-win32 mailing list