On 29/02/2012 8:26 AM, Darren McElfresh wrote:
I’ve read through numerous posts on how to get this to work, but I’ve
realized it is time to ask for help.
In general I have a COM object that returns an event handler:
/event_source = com_object.newEventSource( arg_data )/
I’ve tried establishing the connection points necessary by creating an
event class derived on the sink co-class of this event source:
/class Events(win32com.client.getevents(COM_LIB.CLSID)):/
I included all of the methods that were mentioned in the generated code
from makepy.From there I tried to utilize DispatchWithEvents to connect
the listener:
/event_monitor = win32com.client.DispatchWithEvents( event_source, Events )/

Using DispatchWithEvents means you shouldn't need to use getevents manually at all - it does the getevents for you. So just defining your Events class without a base-class should work - check out the docstring for DispatchWithEvents.

Everything seems fine at this point, but when I use try to listen it
never seems to fire:
/rc = win32event.WaitForSingleObject( event_monitor.event, TIME )/

What is event_monitor.event? I guess it must be an integer event handle, but it is worth checking it is sane. Also, that doesn't really make sense as an event sink - presumably you have referenced the 'event' attribute before an event has fired, so the actual firing of an event doesn't seem to need to do anything - it just sets the handle object and wouldn't need to make a callback into your handler. Generally the firing of an event will explicitly call a method you supply, but that doesn't seem to be the case here.

Even if that was "normal" for your object, you might need MsgWaitForMultipleObjects - a message loop way well be needed to deliver the event calls (ie, so the event handler functions can be called).

I’ve even tried (even though I don’t think it is necessary for single
threaded applications):
/pythoncom.PumpWaitingMessages()/

A single threaded application will have to do *something* while it is waiting for the events to fire, so unless you are in a UI like pythonwin, you *will* need something like PumpMessages - otherwise your thread will just terminate. PumpWaitingMessages only pumps what is queued now - you need PumpMessages to pump "forever" - or until you call PostQuitMessage to kill the pump, presumably in response to a future event)

But I'm missing something - either you expect an "event" to set a Windows event handle (and therefore probably need MsgWaitForMultipleObjects) or you expect an "event" to make a callback on your event handler (in which case you need something like PumpMessages) - but the 2 scenarios are quite different depending on what is expected to happen.

However that didn’t seem to have any impact either.No matter what I try
– I can’t get my handlers to fire.I have sample code on how to do this
in C++, and I have already taken the sample Java code and have my own
version of that working; however I’d prefer to use Python if I can get
it to work.
I can provide my code (or the samples), but it is somewhat lengthy so I
was hoping someone would see what I was missing right away?

Maybe you could just provide a summary of the relevant C++ code?

Mark
_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to