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