在BHO中的DISPID_DOCUMENTCOMPLETE事件中取不到IHTMLDocument2的属性

MapleInHG 2006-09-28 09:39:22
是这样的,我在BHO中想获取网页的内容,在DISPID_DOCUMENTCOMPLETE事件中进行处理,对于普通的单个页面的网页,当然可以得到,但对于有几个frame的网页来说,就取不到IHTMLdocument2对象了,更确切地说,IHTMLDocument对象可以Query到,但就是得不到任何属性,对它试图进行任何读写都会造成IE的崩溃。请问这是什么原因,有没有解决办法?

我是通过DISPID_DOCUMENTCOMPLETE事件的参数得到的子frame的IWebBrowser2对象,可以操作它的各种方法和属性,通过它得到IHTMLDocument2对象应该就是子框架网页的document吧,但不能对它进行任何操作。

求教、求救。
...全文
616 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
MapleInHG 2006-09-30
  • 打赏
  • 举报
回复
本想直接解析源码,看来还是用mshtml取tag来得快和适用一些。
jun_01 2006-09-30
  • 打赏
  • 举报
回复
mark.

高手们看看我的问题
http://community.csdn.net/Expert/TopicView.asp?id=5056106
MapleInHG 2006-09-30
  • 打赏
  • 举报
回复
唉,犯了个错误,我做的时候是通过webbrowser直接得到htmldocument2,正确的做法是先得到一个dispath,然后再queryinstance得到htmldocument2

现在又有另外一个问题了,为什么我在DOCUMENTCOMPLETE里得到的网页源代码与实际下载的不一致,比如本来是“<input type="hidden" name="username" value="xxx"> ”的会变成“<input type=hidden value=xxx name=username> ”即,引号被去掉了,还有顺序也打乱了,请问这是怎么回事?
lion_wing 2006-09-29
  • 打赏
  • 举报
回复
噢,没仔细看楼主的问题。
请参考:
http://blog.csdn.net/lion_wing/archive/2006/09/05/1181389.aspx
lion_wing 2006-09-29
  • 打赏
  • 举报
回复
对于复杂的页面,常会由很多FRAME组成。页面加载时,当每个FRAME加载完毕后都会触发DISPID_DOCUMENTCOMPLETE。可以在DISPID_DOCUMENTCOMPLETE中,判断是否是整个页面加载完毕。
CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> pDisp;
pDisp = pDispParams->rgvarg[1].pdispVal;

CComQIPtr<IUnknown, &IID_IUnknown> pUnkDisp;
pUnkDisp = pDisp;

CComQIPtr<IUnknown, &IID_IUnknown> pUnkBrowser;
pUnkBrowser = m_pWebBrowser2;//m_pWebBrowser2是SetSite中获得的接口

if(pUnkBrowser == pUnkDisp)
{
//整个页面加载完毕
}
else
{
//其它FRAME加载完毕
}
firmbird 2006-09-29
  • 打赏
  • 举报
回复
检查一下浏览器的ReadyState属性,等到加载完成再去读取
MapleInHG 2006-09-29
  • 打赏
  • 举报
回复
to firmbird(firmbird):
ReadyState是READYSTATE_COMPLETE哦。

to lion_wing(凤之焚):
谢谢,我不知道你提供的遍历的例子可不可行,我其实也得到了IHTMLDocument对象,只是不能获取它的属性和方法。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧