[python-win32] COM and ActiveX controls
Geoff Schmidt
gschmidt at gschmidt.org
Tue Apr 19 21:55:22 CEST 2005
Greetings --
I'm trying to embed a web browser inside a Python application. So far,
the most straightforward avenue seems to be to use Mozilla or IE as an
ActiveX control -- they have identical interfaces. It seems like this
should go as follows:
1) Find the HWND of the window in which the control should appear
2) Create a stub object that implements IOleClientSite with no-op
implementations of its methods, since we don't need them
3) Instantiate Mozilla or IE with CoCreateInstance and get the
IOleObject interface
4) Call DoVerb on the control with the HWND, a rectangle giving the
size and position where the control should appear, the IOleClientSite,
and the constant OLEIVERB_INPLACEACTIVATE
5) Call SetExtent on the control as necessary in the future to resize
it in response to parent window resizing
Then, for my application, I'll want to be able to execute Javascript in
the context of the browser, and catch URL loads and trigger application
events in response to them. All of these things appear to be possible
with the IWebBrowser family of interfaces (for which I seem to have a
nice type library, incidentally.)
The first problem I've run into is that pythoncom doesn't wrap
IOleObject, so there's no way to make the call to DoVerb. (Nor is
DoVerb exposed through IDispatch :)) In other words:
unk = pythoncom.CoCreateInstance("Mozilla.Browser", None,
pythoncom.CLSCTX_INPROC, pythoncom.IID_IUnknown)
IID_IOleObject = IID('{00000112-0000-0000-C000-000000000046}')
obj = c.QueryInterface(IID_IOleObject)
-> TypeError: There is no interface object registered that supports
this IID
A few questions:
* How hard would it be for me to put together a wrapping of IOleObject,
IOleClientSite, and whatever else I need to embed a basic ActiveX
control?
* Is there some other way that I missed to do this without wrapping new
interfaces (like some IDispatch trick?)
* Is this approach to embedding a web browser tractable at all? Is
there as easier way? Has anyone had any luck embedding Mozilla in
Python on win32 through a more direct mechanism, like PyXPCOM? (I
haven't been able to find any stories about that happening on the web.)
FWIW, this is for the Windows port of the desktop video player for the
Participatory Culture Foundation's internet TV project. Check it out at
http://www.participatoryculture.org/. For the actual widget set, I have
started out in PyGTK, for skinning support and to ease Linux
portability. It's not at all hard to pull HWND's out of PyGTK. If the
idea of embedding an ActiveX control in PyGTK seems hilariously wrong
to you for some reason that has eluded me, do let me know :)
Thanks a lot --
Geoff Schmidt
More information about the Python-win32
mailing list