none
need help for Interface IWebBrowser! RRS feed

  • 问题

  • #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);
    }
    
    2010年1月29日 10:05

答案

  • Navigate 执行是异步的,需要较长时间。此时位于服务器的页面代码还没全部下载完成,页面解析、加载动作还没完成,Document 对象也就不会存在。只能等待WebBrowser 通知,直到加载完成之后,才可以获取到Document 对象。

    那个宏是不需要的,你看一下蒋晟同学的代码吧:
    http://www.codeproject.com/KB/shell/AutomateShellWindow.aspx
    • 已标记为答案 Joephia 2010年2月1日 7:06
    2010年1月30日 15:44
    版主

全部回复

  • 初始化接口的API调用了么?
    0xBAADF00D
    2010年1月29日 15:42
    版主
  • 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
    2010年1月29日 23:39
    版主
  • I did..

    2010年1月30日 15:09
  • 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()
    2010年1月30日 15:30
  • Navigate 执行是异步的,需要较长时间。此时位于服务器的页面代码还没全部下载完成,页面解析、加载动作还没完成,Document 对象也就不会存在。只能等待WebBrowser 通知,直到加载完成之后,才可以获取到Document 对象。

    那个宏是不需要的,你看一下蒋晟同学的代码吧:
    http://www.codeproject.com/KB/shell/AutomateShellWindow.aspx
    • 已标记为答案 Joephia 2010年2月1日 7:06
    2010年1月30日 15:44
    版主
  • Navigate 执行是异步的,需要较长时间。此时位于服务器的页面代码还没全部下载完成,页面解析、加载动作还没完成,Document 对象也就不会存在。只能等待WebBrowser 通知,直到加载完成之后,才可以获取到Document 对象。

    那个宏是不需要的,你看一下蒋晟同学的代码吧:
    http://www.codeproject.com/KB/shell/AutomateShellWindow.asp
    谢谢Michae同学的耐心指点

    看来我要打消这个思路了,其实我的本意是想在线程里完成下面的任务,很多网页下载软件都有

    1:提供一个URL
    2:CHttpFile下载该URL 对应的文件,保存到本地磁盘
    3:加载这个下载来的文件
    4:分析该文件中对应的超链接
    5:筛选有效超链接
    6:重复Step 1-5

    不过这个任务应该用多线程完成(考虑到效率,要与UI界面分离),因为没有相关的资料,上面都是自己摸索出来的。

    不知道还有没有其他方式来实现分析网页元素的功能。

    另外加载这个下载来的文件通过 IHTMLDocument2 -> Write(SAFEARRAY) 可以立即实现文件的加载,而不用等待通知

    不过如何获取初始的IHTMLDocument2指针就是个问题。因为是在多线程里,所以最好能动态创建一个
    2010年2月1日 0:54
  • 关于 页面解析 有什么资料可以参考的吗?
    2010年2月1日 7:08