我想在加载完页面后自动把滚动条滚到最右边于是我用如下代码
void CBookLocal7View::HtmlOnClick(IHTMLEventObj *pEvtObj)
{
    int i = 0;
}void CBookLocal7View::OnDocumentComplete(LPDISPATCH lpDisp,VARIANT FAR* URL)
{
   CBookLocal7Doc* pDoc = GetDocument();   //webbrowser 控件在document中定义
   IUnknown*  pUnk;
   LPDISPATCH lpWBDisp;
   HRESULT    hr;
IHTMLDocument2 *pDocument = NULL;   pUnk = pDoc->m_WebBrows.GetControlUnknown();
   ASSERT(pUnk);   hr = pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);
   ASSERT(SUCCEEDED(hr));   if (lpDisp == lpWBDisp )   //主框架加载完成
   {
long p;    try
   {
    hr = lpWBDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument );  //获取失败pDocument为0
IHTMLElement *pBody = NULL;
    hr = pDocument->get_body( &pBody );
IHTMLElement2 *pElement = NULL;
    hr = pBody->QueryInterface(IID_IHTMLElement2,(void**)&pElement);
pElement->get_scrollWidth(&p);
pElement->put_scrollLeft(p);
   }catch(...){}
   }  lpWBDisp->Release();
}

解决方案 »

  1.   

    void CBookLocal7View::OnDocumentComplete(LPDISPATCH lpDisp,VARIANT FAR* URL)
    {
        CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> pWeb;
        CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2> pDoc2;
        pWeb = pDisp;
        pWeb->get_Document((IDispatch**)&pDoc2);    if (m_ie.GetDocument() != pDoc2) return;
        //pDoc2->......
    }
      

  2.   

    可以了谢谢,
    但是我还是想不通啊
    我原先是:从自定义的m_WebBrows获得IUnknown-->再获取LPDISPATCH-->和函数传递的LPDISPATCH进行比较,判断主框架是否加载完-->再从LPDISPATCH获取IHTMLDocument2而你是:把传递进来的LPDISPATCH 强制转化成IWebBrowser2-->然后在获取IHTMLDocument2我少了把LPDISPATCH 强制转化成IWebBrowser2的一步,可是我在很多情况下直接都可以从LPDISPATCH 取得IHTMLDocument2,在这为什么要强制转化呢???
      

  3.   

    hr = lpWBDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument );  //获取失败
    你的lpWBDisp是LPDISPATCH类型:LPDISPATCH lpWBDisp;
    它是浏览器对象的接口,所以它支持IWebBrowser2接口,而通过IWebBrowser2::get_Document才能得到MSHTML的接口IHTMLDocument2,所以lpWBDisp不支持IHTMLDocument2接口.