[python-win32] MSHTML wrapper class and example using IWebBrowser2

lkcl lkcl at lkcl.net
Mon Aug 3 00:22:11 CEST 2009


hi there,

from about a dozen different sources i've managed to put together something
similar to the old ctypes atl.py example.  the purpose of the exercise is to
create a port of pyjamas-desktop to MSHTML, and to do that, i need a GDK
window in which an IWebBrowser2 COM object is the only object, and then to
get access to its Document.

i'll be committing the code as free software in the next few days to the svn
repository for http://pyjs.org but i wanted to point people at this example
code in the mean time:
http://lkcl.net/pyjamas - ie_in_gtk.py and ie_in_win.py

as you can see they're a bit of a mess because i took stuff from a boat-load
of different places and just whopped it all together until something worked
how i wanted.

now that i have the proof-of-concept, i'll be quickly moving on to encompass
absolutely every single bit of the MSHTML DOM model and i do mean absolutely
all of it (and including XMLHttpRequest).  the reason is that
pyjamas-desktop relies on manipulation of the DOM model to create the widget
set API.  currently supported is XULRunner and pywebkitgtk but win32 users
are left out in the cold somewhat so... MSHTML-time it is.

what's particularly strategically important is that the intermediate DOM
wrapper classes, of which there are two (pyjd/hula.py and
pyjd/pywebkitgtk.py) make the DOM look *absolutely identical* as far as the
interface is concerned.  i'll be adding an _mshtml.py wrapper which - again
- makes the DOM look utterly and 100% identical to the other two.

just to emphasise that in a different way: with these three DOM wrapper
modules it will be possible to write python web browser engine applications
that will work across a ton of different platforms, whether they be Win32,
Mac, GNU/Linux, FreeBSD or embedded devices.

the wrapper class, _mshtml.py, it's worth noting, will take care of COM
"coclass" interfaces.  one of the lairy daft messes in MSHTML.IDL is the
melding of different COM interfaces, and you're expected to either know or
remember what to do, typecasting objects using QueryInterface to the right
type, before accessing the required property or function.

... i can't be bothered with that kind of crap :)

so, the _mshtml.py class will take care of it, and so instead of this:

   style.left = 0
   style2 = style.QueryInterface(MSHTML.IHTMLStyle2)
   style2.position = "absolute"

you just do this:

   style.left = 0
   style.position = "absolute"

ahhhh, peace of miiind :)

behind the scenes, there's a coclass wrapper which inherits from the
necessary classes (in this case, _mshtml.IHTMLStyle2, _mshtml.IHTMLStyle3
.... etc.) and each of those classes has properties:

   def _get_position(self):
        return wrap(self.__get_instance_IHTMLStyle3().position
   position = property(self._get_position,....)

   def __get_instance_IHTMLStyle3(self):
      return self.__instance__.QueryInterface(MSHTML.IHTMLStyle3)

etc. etc.

so - not blazingly efficient, but that's the price to pay for convenience.

if you're interested, keep an eye on http://pyjs.org svn repository,
pyjamas/pyjd subdirectory, over the next few days.

l.
-- 
View this message in context: http://www.nabble.com/MSHTML-wrapper-class-and-example-using-IWebBrowser2-tp24782740p24782740.html
Sent from the Python - python-win32 mailing list archive at Nabble.com.



More information about the python-win32 mailing list