请问获得IHTMLDocument的接口指针后,如何获取这个网页中指向IFrame的接口指针,如何遍历这个网页中的IFrame个数啊?问题一解决,立即给分!

解决方案 »

  1.   

      VARIANT   frameRequested;   
      VARIANT   frameOut;   
      IHTMLFramesCollection2*   pFramesCol;   
      IHTMLWindow2*   pRightFrameWindow;   
      IHTMLDocument2*   pRightDoc;   
        
      frameRequested.vt   =   VT_BSTR;   
      frameRequested.bstrVal   =   L"rightframe";   
        
      hr   =   pWin->get_frames(&pFramesCol);   
      hr   =   pFramesCol->item(&frameRequested,   &frameOut);   
        
      hr   =   frameOut.pdispVal->QueryInterface(IID_IHTMLWindow2,   (void**)&pRightFrameWindow);   
      hr   =   pRightFrameWindow->get_document(&pRightDoc);   
      

  2.   

    IHTMLWindow2::get_frames可能取不到frame,要通过下面的方式来取:
    IHTMLDocument3::getElementsByTagName("iframe")
    然后调用get_length就能得到frame的个数,调用item(index)就能得到每个iframe
      

  3.   

    取到新的frame窗口指针,取得其文档指针.然后做一个递归调用.可以遍历所有frame.
      

  4.   

    递归调用.
    这个看看.
    // 枚举Frame
    CComPtr<IDispatch> spDisp;
    spDisp.p = m_myie.GetDocument();
    EnumFrame(spDisp.p);bool EnumFrame(LPDISPATCH pDisp)
    {
    bool bToContinue = true;
    // 检查文档状态
    CheckDocStatus(spDisp.p);
    CComQIPtr<IHTMLDocument2> pHTMLDocument2(spDisp);
    if (pHTMLDocument2)
    {
    IHTMLFramesCollection2 *pCol=NULL;
    HRESULT hr;
    hr=pHTMLDocument2->get_frames(&pCol);       //取得分帧的frame数组
    if (SUCCEEDED(hr))
    {
    long p;
    CComVariant varIndex,varFrame;
    hr = pCol->get_length(&p);
    if (SUCCEEDED(hr))
    {
    for (int i = 0; bToContinue && i < p; i++)
    {
    varIndex = i;
    hr = pCol->item(&varIndex,&varFrame);
    if (SUCCEEDED(hr))
    {
    IHTMLDocument2 *pDoc2=NULL;
    hr=((IHTMLWindow2 *)varFrame.pdispVal)->get_document(&pDoc2);
    if (SUCCEEDED(hr))
    {
    EnumFrame(pDoc2);
    CComBSTR bstrUrl;
    hr=pDoc2->get_URL(&bstrUrl);
    if (SUCCEEDED(hr))
    {
    TRACE("get_document get_URL: %s\r\n",CString(bstrUrl));
    }
    // 检查文档状态
    if (!CheckDocStatus(pDoc2))
    {
    bToContinue = false;
    }
      pDoc2->Release();
    }
      }
    }
    TRACE("Frames get_length: %ld\r\n",p);
      }
    pCol->Release();
    }
    }
    return bToContinue;
    }