By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,715 Members | 768 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,715 IT Pros & Developers. It's quick & easy.

WebBrowser: How to cast the document object

P: n/a
zdp
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.

However, I also noted that the class wx.lib.iewin.IEHtmlWindow has a
*LoadStream* method, I thought it's a wrapper of IPersistStreamInit's
Load method. So I trace the source code, but only found the implement
is in the c++ base class.

Could anybody tell me how to do it? Any clues is helpful.

Dapu

May 6 '07 #1
Share this Question
Share on Google+
1 Reply


P: n/a

"zdp" <zh******@gmail.comwrote in message news:11*********************@p77g2000hsh.googlegro ups.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_I PersistStreamInit)

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 =----
May 6 '07 #2

This discussion thread is closed

Replies have been disabled for this discussion.