Dispatch, DispatchWithEvents

Thomas Heller theller at python.net
Wed Mar 10 13:17:35 EST 2004


[followup to myself...]

Thomas Heller <theller at python.net> writes:

> I'm currently reinventing the wheel ;-), implementing 'clones' for the
> win32com.client.Dispatch and DispatchWithEvents functions using ctypes.
> It works fairly well, although the more complicated data types like
> SAFEARRAY or RECORD are not yet implemented.
>
> The win32com.client versions of these functions require makepy support
> (for DispatchWithEvents), and create this on demand.  The ctypes
> versions don't require something similar, they are using the ITypeComp
> interface at runtime to bind methods, properties, and constants on
> demand, for events support they use either IProvideClassInfo2 to find
> the outgoing interface, or iterate through the type library to find the
> type info and finally ITypeComp for the default outgoing interface.
>
> For my own sake, I'm trying to keep the ctypes version as compatible as
> possible to the win32com versions, although I'm not happy by some of the
> design decisions Mark Hammond or whoever wrote this stuff made.
>
> First, constants defined in the type libraries are exposed in the
> win32com.client.constants instance, which is internally a sequence of
> dictionaries.  Wouldn't it be better to have the constants available in
> the object returned by the Dispatch() call itself, maybe in a _constants
> property?  I'm also wondering how VB does this...
>
> My second 'complaint' is about the event handlers.  It seems win32com
> prepends 'On' to the method handler names if the method itself, as
> defined in the type library, doesn't already start with 'On'.  Take
> Internetexplorer as an example.  The DWebBrowserEvents2 outgoing
> interface has methods named "BeforeNavigate2", "NavigateComplete2", and
> "OnQuit".  The handlers in Python then must be named
> "OnBeforeNavigate2", "OnNavigateComplete2", and "OnQuit".  The method
> names look nice in the Python class implementation, and their templates
> are also available as commented out code in the makepy generated files,
> but looking at the Internet Explorer type library with Oleview, I find
> this very confusing.  What is the reason that it was chosen this way?

Maybe this has to do with the fact (I didn't know this before) that
DispatchWithEvents(progid, user_event_class) returns an instance of a
class which has user_event_class as one of its base classes.  So, all
the COM methods, properties, and even the event handler methods share a
common namespace.

Thomas





More information about the Python-list mailing list