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 inhr = 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.Ich schaue mir den Code auch noch einmal an. Ich muss allerdings von TCppWebBroser auf TWebBrowser umschreiben
-
-
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);