2009-07-13 10 views
1

Actuellement, j'utilise MSAA pour obtenir un objet IHTMLDocument2 à partir d'un IE HWND. Toutefois, avec certaines applications Web complexes, cet objet IHTMLDocument2 peut contenir plusieurs objets IHTMLDocument2, dont certains n'appartiennent pas à la page en cours d'affichage, mais à la page précédente.Comment obtenir l'objet IHTMLDocument2 le plus courant à partir de IE DOM

Il me semble, IE ne refait pas parfois son objet DOM, mais continue à ajouter plus d'objet IHTMLDocument2 dans son DOM. Ma question est comment puis-je obtenir l'objet IHTMLDocument2 en cours d'affichage de l'objet DOM.

Merci à l'avance

Mise à jour

Salut Remy,

Merci pour votre réponse.

Oui, vous avez raison, j'utilise des cadres pour accéder à d'autres objets IHTMLDocument2. Ma compréhension est que l'objet IHTMLDocument2 que je reçois d'un HWND est l'objet supérieur dans son DOM. IE place parfois les objets IHTMLDocument2 déjà présents dans l'un des cadres.

Voici une partie de mon code.

BOOL IESpy::GetHTMLText(CComPtr<IHTMLDocument2> spDoc, int tagNo, int schNo) 
{ 
    USES_CONVERSION; 

    HRESULT hr = NULL; 
    BOOL res = TRUE; 
    BOOL doneSearch = FALSE; 

    // Extract the source code of the document 
    if (spDoc) { 
     IHTMLFramesCollection2* pFrames = NULL; 
     if (hr = (spDoc->get_frames(&pFrames)) == S_OK){ 
      LONG framesCount; 
      pFrames->get_length(&framesCount); 
      if (framesCount > 0) { 
       for(long i=0; i < framesCount; i++) { 
        VARIANT varIdx; 
        varIdx.vt=VT_I4; 
        VARIANT varResult; 
        varIdx.lVal=i; 
        VariantInit(&varResult); 
        hr = pFrames->item(&varIdx, &varResult); 
        if (SUCCEEDED(hr) && (varResult.vt == VT_DISPATCH)){ 
         CComQIPtr<IHTMLWindow2> pFrameWnd; 
         CComQIPtr<IHTMLDocument2> pFrameDoc; 
         CComBSTR description=NULL; 
         pFrameWnd = varResult.pdispVal; 
         VariantClear(&varResult); 
         if (pFrameWnd == 0) { 
          continue; 
         } 
         hr = pFrameWnd->get_document(&pFrameDoc); 
         if (SUCCEEDED(hr) && pFrameDoc){ 
          GetHTMLText(pFrameDoc, tagNo, schNo); 
          if (m_foundText) { 
           break; 
          } 
         } else if (hr == E_ACCESSDENIED) { 
          CComQIPtr<IWebBrowser2> spBrws = HtmlWindowToHtmlWebBrowser(pFrameWnd); 
          if (spBrws != NULL) { 
           // Get the document object from the IWebBrowser2 object. 
           CComQIPtr<IDispatch> spDisp; 
           hr = spBrws->get_Document(&spDisp); 
           if (hr == S_OK) { 
            pFrameDoc = spDisp; 
            if (pFrameDoc) { 
             GetHTMLText(pFrameDoc, tagNo, schNo); 
             if (m_foundText) { 
              break; 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 

      pFrames->Release(); 

      if (!m_foundText) { 
       res = ReadSearchText(spDoc, tagNo, schNo); 
       doneSearch = TRUE; 
      } 
     } 
     if (!m_foundText && doneSearch == FALSE) { 
      res = ReadSearchText(spDoc, tagNo, schNo); 
     } 
    } 

    return res; 
} 

BOOL IESpy::ReadSearchText(CComPtr<IHTMLDocument2> spDoc, int tagNo, int schNo) 
{ 
    USES_CONVERSION; 

    HRESULT hr = NULL; 
    BOOL found = FALSE; 

    IHTMLElementCollection *pAll; 
    hr = spDoc->get_all(&pAll); 
    if (FAILED(hr)) { 
     return FALSE; 
    } 
    long items; 
    IDispatch *ppvDisp; 
    IHTMLElement *ppvElement; 
    pAll->get_length(&items); 

    std::wstring foundText = L""; 
    for (long j = 0; j < items; j++) { 
     VARIANT index; 
     index.vt = VT_I4; 
     index.lVal = j; 
     hr = pAll->item(index, index, &ppvDisp); 
     if (FAILED(hr)) { 
      return FALSE; 
     } 

     if (ppvDisp) { 
      ppvDisp->QueryInterface(IID_IHTMLElement, (void **)&ppvElement); 
      if (ppvElement) { 
       CComBSTR bstrTag; 
       ppvElement->get_tagName(&bstrTag); 
       wchar_t *wtemp = OLE2W(bstrTag);  
       if (wtemp) { 
        std::wstring text = ReadSearchText(ppvElement, wtemp, tagNo, schNo, found); 
        if (!text.empty()) { 
         if (!foundText.empty()) { 
          foundText += concat_string; 
         } 
         foundText += text; 
        } 
        ppvElement->Release(); 
        if (found) { 
         BOOL stop = FALSE; 
         for (size_t i = 0; i < m_tagName[tagNo]->size(); i++) { 
          if (wcscmp(m_tagName[tagNo]->at(i).c_str(), L"HTML") == 0 
           || wcscmp(m_tagName[tagNo]->at(i).c_str(), L"HEAD") == 0 
           || wcscmp(m_tagName[tagNo]->at(i).c_str(), L"BODY") == 0) { 
           stop = TRUE; 
           break; 
          } 
         } 
         if (stop) { 
          break; 
         } 
        } 
       } else { 
        ppvElement->Release(); 
       } 
      } 
     } 
    } 

    if (!foundText.empty()) { 
     if (m_screenCompare) { 
     // long timeStamp = GetHPTimeStamp(spDoc); 
     // m_temp_results[timeStamp] = foundText; 
      m_temp_results.push_back(foundText); 
     } else { 
      m_result += foundText; 
      m_result += L" "; 
      m_foundText = TRUE; 
     } 
    } 

    return TRUE; 
} 
+0

Si vous êtes déjà en cours de traitement, pourquoi voudriez-vous utiliser MSAA ici? Juste itérer les DOM directement. – EricLaw

Répondre

2

Un IHTMLDocument2 ne peut pas contenir d'autres objets IHTMLDocument2 (à moins qu'ils appartiennent à des cadres sur la page), et certainement pas des pages précédentes. Comment déterminez-vous cela exactement? Pouvez-vous montrer du code?