WebBrowser: How to cast the document object

Roger Upole rupole at hotmail.com
Sun May 6 17:32:00 EDT 2007


"zdp" <zhaodapu at gmail.com> wrote in message news:1178482264.678509.58730 at p77g2000hsh.googlegroups.com...
> Hi, all,
>
> My project is based on wxPython, and I need an IE control (i.e.
> WebBrowser ActiveX control). Although the wxPython implements a
> wrapped version (wx.lib.iewin.IEHtmlWindow), but it doesn't meet all
> my demands, because  I need to custom many behaviors of the control.
> So I thought I should use it through ActiveXWrapper directly.
>
> So I use makepy to make the typelib of "Microsoft Internet Controls"
> and "Microsoft HTML Object Library". Now I can get the document object
> of the WebBrowser, and I can cast it into any interface I need like
> IHtmlDocument2, IHtmlDocument3...  So far, so good.
>
> The document object also implements a COM interface
> IPersistStreamInit, which has a *Load* method. Calling this method can
> load any stream into the browser control. Here is the a example using
> this method in visual c++:
>
> IPersistStreamInit* spPSI = NULL;
> CStreamOnCString stream(szHTML);
> if (m_pHtmlDoc)  {
> m_hResult = m_pHtmlDoc->QueryInterface(IID_IPersistStreamInit,
> (void**)&spPSI);
> if( SUCCEEDED(m_hResult) && spPSI ) {
> m_hResult = spPSI->Load(static_cast<IStream*>(&stream));
> spPSI->Release();
> }
> }
>
> Now I need to call this method on my document object, my code is just
> like
>
>            stream = win32com.client.CastTo(doc, "IPersistStreamInit")
>            stream.Load(somestr)
>
> But I got an error:
>
> ValueError: The interface name 'IPersistStreamInit' does not appear in
> the same
> library as object '<win32com.gen_py.Microsoft HTML Object
> Library.DispHTMLDocume
> nt instance at 0x46359096>'
>
> I googled and someones says only interfaces inherit from IDispatch can
> be used by pythoncom. But IPersistStreamInit interface inherits from
> IUnknown. But I just need to use
> this interface.

Many non-IDispatch interfaces are supported by pythoncom, IPersistStreamInit among them.
You should be able to use QueryInterface just as the c++ code does.
Try something like

stream=doc._oleobj_.QueryInterface(pythoncom.IID_IPersistStreamInit)

   hth
        Roger




----== Posted via Newsfeeds.Com - Unlimited-Unrestricted-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----



More information about the Python-list mailing list