Exporting events from Python COM class.
Mark Hammond
MarkH at ActiveState.com
Fri Nov 10 22:24:29 EST 2000
Alex Martelli wrote:
>> Thus, I _think_ you could get the behaviour you want by changing the "1"
>> to IID_IDispatch, and removing the second QI.
>
>
> Yes! It works fine. It suffices to substitute lines 33-34
> in win32com.server.connect.py with the single line
>
> interface =
> pUnk.QueryInterface(self._connect_interfaces_[0],pythoncom.IID_IDispatch)
>
> and that now appears to work flawlessly.
OK - I have made that change.
>>> Some COM background (which I'm sure you don't need, but may come
>>> in handy for some readers!):
>>
>> Thanks - and to my mind, is exactly the reason why I _dont_ want to
>> break the rules here!
>
>
> But you do, if you QI a dispinterface for IID_IDispatch.
Yes - Toby and your explanations have cleared this up for me - thanks!
>> So really, they are saying there _is_ good reason to do this, but it is
>> not compatible with VB.
>
> *sigh* not really, although I see how you could read it this
> way. There is NO good reason to have a source-interface be
> dual. If VB (and, actually, every other scripting language)
> were of no importance, you could make it custom (that's OK,
> you can do it now, as long as you know no scripting language
> nor VB will be able to sink those events -- as long as you're
> at it, why follow the connection-point protocol either -- you
> can optimize connection/disconnection operations too, by
> customizing them to your actual needs; connection-point is
> designed with generic applicability in mind, basically to
> enable connection from scripting and VB...). If VB and other
> scripting languages matter, you clearly have to make it a
> dispinterface (that's what they know how to sink, of course).
I see where you are coming from, but don't take your point. I don't see
why the IDispatch-like mechanism buys genericity. It buys simplicity of
implementation. If the event interfaces are described in a type library
and VB is capable of putting together arbitrary vtables given the tlb
definition, I don't see why the IDispatch like mechaism is central to
the scheme.
And if is not central, the cost (dispid lookup, VARIANT conversion, etc)
may be worth reducing in some apps - especially if they know a vtable
capable client _may_ possibly connect, and wish to support high
performance when they do.
Anyway, it isn't directly relevant to win32com.
> (I gather the .NET "solution" to "how do I script just
> ANY interface" is yet another, i.e., that the _interpreter_
> has to take the burden [using the rich metadata supplied,
> and with some modest assist from the runtime] since there
> is no real "broker" layer as in Corba -- but you know a
> zillion more times than I do on .NET, so maybe you can
> confirm or deny this impression!-).
If I understand the question, you are correct. An interpreter running
in the .NET environment could get all the meta data it needs at runtime,
and package a Reflection call at runtime. It is actually quite trivial.
However, I am not sure _why_ you would do this. Part of the advantage
of .NET is running your language under their VM, so then this becomes a
compiler issue.
If you want to use good-old, interpreted CPython, just use the .NET COM
interop layers - they have already dont the .NET integration, and lots
of tools already support COM.
In terms of win32com, .NET objects just looks like COM objects with
complete, rich type information - so no current need for specific .NET
extensions to CPython. Some _will_ popup, no doubt (and the
"bForDemand" changes to makepy were basically done for it ;-)
> (Where does one submit win32all patches, and in what diff
> format...? The only diff programs I have easily available
> on Windows are GUI-oriented, but I can of course download
> whatever is required, just point...!-).
Just to me in whatever format is easiest. If you did a CVS fetch just
before mailing, then the entire file is fine. If it happens too
regularly I will get sick of it and just give you CVS commit access ;-)
Mark.
More information about the Python-list
mailing list