AW: COM Question: How to respond to Windows events?

Stefan Schukat SSchukat at dspace.de
Thu Sep 13 02:50:40 EDT 2001


Hi,

you have to use DispatchWithEvents instead of Dispatch, i.e.
>>> class IEEvents:
...    def OnVisible(self, visible):
...       print "Visible changed:", visible
...
>>> ie = DispatchWithEvents("InternetExplorer.Application", IEEvents)
>>> ie.Visible = 1
Visible changed: 1

So in your case:

>>> from  XXXX  import DIOPCGroupEvent # XXXX the name of your makepy module
>>> class MyEvents(DIOPCGroupEvent):
...	def OnDataChange(self, TransactionID, NumItems, ClientHandles,
...				    ItemValues, Qualities, TimeStamps):
...		print "OnDataChange"
>>> s=win32com.client.DispatchWithEvents('OPC.Automation.1', MyEvents)


	Stefan


> -----Ursprüngliche Nachricht-----
> Von: Steve Goldman [mailto:steve_g at ix.netcom.com]
> Gesendet: Donnerstag, 13. September 2001 01:06
> An: python-list at python.org
> Betreff: COM Question: How to respond to Windows events?
> 
> 
> Hi,
> 
> I'm trying to use a COM object that contains an object called 
> OPCGroup with
> an event called DataChange.  I can use the objects, call 
> their methods, read
> their properties, etc., but I have no idea how to respond to events.
> 
> In Visual Basic, I would create a subroutine called 
> OPCGroup_DataChange and
> put my event handler there.  Note:  I can make it work in VB.
> 
> I used makepy.py to create a .py file for the object library. 
>  It has the
> following event object in it.
> 
> ****CODE STARTS*****
> 
> class DIOPCGroupEvent:
>  "OPC Group Events"
>  CLSID = CLSID_Sink =
> pythoncom.MakeIID('{28E68F97-8D75-11D1-8DC3-3C302A000000}')
>  _public_methods_ = [] # For COM Server support
>  _dispid_to_func_ = {
>           4 : "OnAsyncCancelComplete",
>           1 : "OnDataChange",
>           2 : "OnAsyncReadComplete",
>           3 : "OnAsyncWriteComplete",
>   }
> 
>  def __init__(self, oobj = None):
>   if oobj is None:
>    self._olecp = None
>   else:
>    import win32com.server.util
>    from win32com.server.policy import EventHandlerPolicy
>    
> cpc=oobj._oleobj_.QueryInterface(pythoncom.IID_IConnectionPoin
> tContainer)
>    cp=cpc.FindConnectionPoint(self.CLSID_Sink)
>    cookie=cp.Advise(win32com.server.util.wrap(self,
> usePolicy=EventHandlerPolicy))
>    self._olecp,self._olecp_cookie = cp,cookie
>  def __del__(self):
>   try:
>    self.close()
>   except pythoncom.com_error:
>    pass
>  def close(self):
>   if self._olecp is not None:
>    cp,cookie,self._olecp,self._olecp_cookie =
> self._olecp,self._olecp_cookie,None,None
>    cp.Unadvise(cookie)
>  def _query_interface_(self, iid):
>   import win32com.server.util
>   if iid==self.CLSID_Sink: return win32com.server.util.wrap(self)
> 
> # Handlers for the control
> # If you create handlers, they should have the following prototypes:
> # def OnAsyncCancelComplete(self, CancelID=defaultNamedNotOptArg):
> # def OnDataChange(self, TransactionID=defaultNamedNotOptArg,
> NumItems=defaultNamedNotOptArg, ClientHandles=defaultNamedNotOptArg,
> ItemValues=defaultNamedNotOptArg, Qualities=defaultNamedNotOptArg,
> TimeStamps=defaultNamedNotOptArg):
> # def OnAsyncReadComplete(self, TransactionID=defaultNamedNotOptArg,
> NumItems=defaultNamedNotOptArg, ClientHandles=defaultNamedNotOptArg,
> ItemValues=defaultNamedNotOptArg, Qualities=defaultNamedNotOptArg,
> TimeStamps=defaultNamedNotOptArg, Errors=defaultNamedNotOptArg):
> # def OnAsyncWriteComplete(self, TransactionID=defaultNamedNotOptArg,
> NumItems=defaultNamedNotOptArg, ClientHandles=defaultNamedNotOptArg,
> Errors=defaultNamedNotOptArg):
> 
> ***CODE ENDS***
> 
> Can anyone tell me how to get my code to recognize the 
> DataChange event?
> 
> This is the working code that dispatches the COM object
> 
> ***CODE STARTS***
> 
> import win32com.client
> s=win32com.client.Dispatch('OPC.Automation.1')
> s.Connect('KEPware.KEPServerEx.V4')
> groups=s.OPCGroups
> group=groups.Add('Group1')
> items=group.OPCItems
> item=items.AddItem('Test_Group.Test_Device.TI27101',1)
> 
> ***CODE ENDS***
> 
> Thanks.  Sorry for the length of the post.
> 
> 
> -- 
> http://mail.python.org/mailman/listinfo/python-list
> 




More information about the Python-list mailing list