html-quelltext auslesen in TWebBrowser



  • Hallo,

    Ich habe im BCC den TWebBrowser eingebunden.
    Dann habe ich #include "MSHTML.h" eingebunden.

    Mit folgendem Code möchte ich den Quelltext auslesen, oder Dynamischen zugriff auf eine im Browser beim Ereignis 'DocumentComplete' eine geladenen Webseite auslesen/erhalten.

    Kommentar im Quelltext mit EAccsesViolation

    IHTMLDocument2* pDocInterface;
    IHTMLElementCollection* pElemColl;
    IDispatch* pElemDisp;
    long hr = 0;
    IHTMLElement* pElem;
    IHTMLElement* pPPElem;
    wchar_t *strItem;
    
    //browser ist TWebBrowser
    hr = browser->Document->QueryInterface(IID_IHTMLDocument2, (void**)&pDocInterface);
    
    hr = pDocInterface->get_all(&pElemColl);
    
    long len;
    pElemColl->get_length(&len);
    
    tagVARIANT varIdx;
    tagVARIANT varID;
    
    varIdx.lVal = 0;
    for(long i=0;i<len;i++)
    {
        varID.lVal = i;
        hr = pElemColl->item(varID, varIdx, &pElemDisp);
    
            //Hier erhelte ich eine EAccsesViolation
            hr = pElemDisp->QueryInterface(IID_IHTMLElement, (void**)&pElem);
    
            if (SUCCEEDED(hr))
            {
                pElem->get_className(&strItem);
                AnsiString astr = WideCharToString(strItem);
                Memo1->Text = Memo1->Text + astr + "\r\n";
    
            }
    }
    

    kann mir jemand helfen, oder eine bessere Methode

    Danke



  • Hallo

    also in deinem Codeausschnitt steht nicht, ob und wie du eine Instanz für pElemDisp erstellst. Überprüf das mal als erstes.

    Edit : Prüf mal vor dem Zugriff auf auf pElemDisp, ob das gültig ist.

    bis bald
    akari



  • In der dritten Zeile

    IDispatch* pElemDisp;



  • Hallo

    das ist Deklaration des Zeigers.
    Die Instanz erstellst du wohl in

    hr = pElemColl->item(varID, varIdx, &pElemDisp);
    

    danach und vor dem Zugriff auf pElemDisp solltest du pElemDisp mit dem Debugger überprüfen.

    bis bald
    akari





  • akari schrieb:

    danach und vor dem Zugriff auf pElemDisp solltest du pElemDisp mit dem Debugger überprüfen.

    Leider kenne ich mich in den Feinheiten des Debuggen noch nicht so gut aus, um speziell eine Variable zu überprüfen.

    Ich weiß nur, dass bis nach
    hr = pElemColl->item(varID, varIdx, &pElemDisp);
    alles glatt läuft(habe ich mit ShowMessage vorher und nachher ausprobiert), und eben erst in der nächsten Zeile das EAccsesViollation auftritt.

    @Jansen

    Ich schaue mir den Code auch noch einmal an. Ich muss allerdings von TCppWebBroser auf TWebBrowser umschreiben





  • @BigNeal

    Falls Du die Info zum Debuggen meinst.
    Auch mit Zeilenweise debuggen komme ich zu dem Ergebnis, das in der Zeile
    hr = pElemDisp->QueryInterface(IID_IHTMLElement, (void**)&pElem);
    eine EAccsessViolation auftritt



  • Danke nochmal für die Antworten

    Der Link von Jansen hat mir weitergeholfen.
    Man kann in der Daklaration einfach TCppWebBrowser auf TWebBrowser umschreiben



  • oberer Code muss folgender Maßen geändert werden

    VARIANT varID;          //statt tagVARIANT
                              //und zusätzlich
      varID.vt = VT_UINT;     
    
      VARIANT varIdx;         //statt tagVARIANT
                              //und zusätzlich
      VariantInit( &varIdx );
    
      //In der Schleife varID folgendermaßen hochzählen
      for(long i=0;i<len;i++)
      {
          varID.lVal = i;
    
          hr = pElemColl->item(varID, varIdx, &pElemDisp);
    

Anmelden zum Antworten