积极答复者
need help for Interface IWebBrowser!

问题
-
#include <atlbase.h> #include <mshtml.h> void CTSDlg::OnOK() { CWnd *pWnd=GetDlgItem(IDC_WEB); CRect rec; pWnd->GetWindowRect(&rec); this->ScreenToClient(&rec); pWnd->DestroyWindow(); pWnd->CreateControl(CLSID_WebBrowser,NULL,WS_VISIBLE|WS_CHILD,rec,this,IDC_WEB); CComPtr<IUnknown> pUnk; CComPtr<IWebBrowser2> pBrowser; pUnk=pWnd->GetControlUnknown(); pUnk->QueryInterface(&pBrowser); pBrowser->Navigate(L"http://www.google.com",NULL,NULL,NULL,NULL); //Something need to do here to support the code below //... CComPtr<IDispatch> pDisp; CComPtr<IHTMLDocument2> pDoc; pBrowser->get_Document(&pDisp); //pDisp returns NULL here pDoc->QueryInterface(&pDoc); }
答案
全部回复
-
What's up ?
//Something need to do here to support the code below
The WebBrowser uses DWebBrowserEvents/DWebBrowserEvents2 interfaces by event callback. Your application must implement to receive event notifications from a WebBrowser control.
//...
The NavigateComplete/NavigateComplete2 methods which was in DWebBrowserEvents/DWebBrowserEvent2 interfaces tell you what time a frame loaded complete.
There is a artical for you:
http://blog.csdn.net/shanhe/archive/2005/08/11/451681.aspx -
NavigateComplete/NavigateComplete2 methods
是否意味着我要添加一个事件响应函数,在这个函数中我可以使用IHtmlDocument2接口?
但是我想能够在一个函数里触发这个事件,然后完成DocumentComplete,然后再查询IHTMLDocument2接口另作他用,
而不是被动的等待。
因为我想把这些事情放到子线程里去,但是又不知道在子线程里怎么获取这些事件。
另外DWebBrowserEvents/DWebBrowserEvents2 没用过,不知道该怎么调用,要添加诸如此类的宏吗?(见下)BEGIN_EVENTSINK_MAP(CHtmlView, CFormView) ON_EVENT(CHtmlView, AFX_IDW_PANE_FIRST, 102 /* StatusTextChange */, OnStatusTextChange, VTS_BSTR) ... END_EVENTSINK_MAP()
-
Navigate 执行是异步的,需要较长时间。此时位于服务器的页面代码还没全部下载完成,页面解析、加载动作还没完成,Document 对象也就不会存在。只能等待WebBrowser 通知,直到加载完成之后,才可以获取到Document 对象。
谢谢Michae同学的耐心指点
那个宏是不需要的,你看一下蒋晟同学的代码吧:
http://www.codeproject.com/KB/shell/AutomateShellWindow.asp
看来我要打消这个思路了,其实我的本意是想在线程里完成下面的任务,很多网页下载软件都有
1:提供一个URL
2:CHttpFile下载该URL 对应的文件,保存到本地磁盘
3:加载这个下载来的文件
4:分析该文件中对应的超链接
5:筛选有效超链接
6:重复Step 1-5
不过这个任务应该用多线程完成(考虑到效率,要与UI界面分离),因为没有相关的资料,上面都是自己摸索出来的。
不知道还有没有其他方式来实现分析网页元素的功能。
另外加载这个下载来的文件通过 IHTMLDocument2 -> Write(SAFEARRAY) 可以立即实现文件的加载,而不用等待通知
不过如何获取初始的IHTMLDocument2指针就是个问题。因为是在多线程里,所以最好能动态创建一个