C++ Builder Snippets  

TCppWebBrowser: Links aus der angezeigten Seite extrahieren
 
Folgende Routine extrahiert alle Links der im TCppWebBrowser angezeigten Seite. Der Code funktioniert auch auf den Seiten mit Frames.
#include <mshtml.h>

//---------------------------------------------------------------------------
// Funktion ExtractLinks() extrahiert alle Links des aktuell geladenen
// Dokuments im TCppWebBrowser in die übergebene TStrings-Instanz
//---------------------------------------------------------------------------
// Übergabeparameter:
//
// TCppWebBrowser* pCppWebBrowser: Zeiger auf die TCppWebBrowser-Instanz
// TStrings* pStrings             : Zeiger auf die TStrings-Instanz für die
//                                 Ausgabe der Linkliste
//---------------------------------------------------------------------------
void ExtractLinks(TCppWebBrowser* pCppWebBrowser, TStrings* pStrings)
{
  pStrings->Clear();
  IHTMLDocument2 *HTMLDocument = NULL;
  LONG ilFramesCount = 0;

  // Falls eine Seite geladen:
  if(SUCCEEDED(pCppWebBrowser->Document->QueryInterface(
    IID_IHTMLDocument2, (LPVOID*)&HTMLDocument)))
  {
    // ggf. auch Frames-Code extrahieren:
    IHTMLFramesCollection2 *pFrames = NULL;
    if(SUCCEEDED(HTMLDocument->get_frames(&pFrames)))
    {
      // Anzahl der Frames bestimmen:
      pFrames->get_length(&ilFramesCount);

      if(ilFramesCount < 2)
        ExtractDocumentLinks(HTMLDocument, pStrings);
      else
      {
        VARIANT vFrame;
        VARIANT ret;
        vFrame.vt = VT_UINT;
        // für jedes Frame:
        for(LONG ilFrameIndex = 0; ilFrameIndex < ilFramesCount; ilFrameIndex++)
        {
          vFrame.lVal = ilFrameIndex;
          if(SUCCEEDED(pFrames->item(&vFrame, &ret)))
          {
            // Zeiger auf IHTMLWindow2 des Frames besorgen:
            IHTMLWindow2 *pWindow = NULL;
            if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2,
              (LPVOID*)&pWindow)))
            {
              // Zeiger auf IHTMLDocument2 des Frames besorgen:
              IHTMLDocument2 *pDoc = NULL;
              if(SUCCEEDED(pWindow->get_document(&pDoc)))
              {
                pStrings->Add("\n- - - Frame " +
                  IntToStr(ilFrameIndex+1) + " - - -");
                 ExtractDocumentLinks(pDoc, pStrings);
                pDoc->Release();
              }
              pWindow->Release();
            }
          }
        }
      }
      pFrames->Release();
    }
    HTMLDocument->Release();
  }
}

//---------------------------------------------------------------------------
// Funktion ExtractLinks() extrahiert alle Links der übergebenen
// IHTMLDocument2-Instanz in die TStrings-Instanz
//---------------------------------------------------------------------------
// Übergabeparameter:
//
// IHTMLDocument2* pHTMLDocument : Zeiger auf die IHTMLDocument2-Instanz
// TStrings* pStrings             : Zeiger auf die TStrings-Instanz für die
//                                 Ausgabe der Linkliste
//---------------------------------------------------------------------------
void ExtractDocumentLinks(IHTMLDocument2* pHTMLDocument, TStrings* pStrings)
{
  if(pHTMLDocument)
  {
    IHTMLElementCollection *pAnchors = NULL;
    if(SUCCEEDED(pHTMLDocument->get_all(&pAnchors)))
    {
      long ilHrefCount = 0;
      if(SUCCEEDED(pAnchors->get_length(&ilHrefCount)))
      {
        for(long ilHrefIndex = 0; ilHrefIndex < ilHrefCount; ilHrefIndex++)
        {
          VARIANT vIndex;
          vIndex.vt = VT_I4;
          vIndex.lVal = ilHrefIndex;

          IDispatch *pItem = NULL;
          pAnchors->item(vIndex, vIndex, &pItem);
          if(pItem != NULL)
          {
            IHTMLAnchorElement *pAnchor = NULL;
            if(SUCCEEDED(pItem->QueryInterface(IID_IHTMLAnchorElement,
              (LPVOID*)&pAnchor)))
            {
              BSTR bURL;
              if(SUCCEEDED(pAnchor->get_href(&bURL)) &&
                pStrings->IndexOf(AnsiString(WideString(bURL))) < 0 &&
                AnsiString(WideString(bURL)).Trim() != EmptyStr)
                pStrings->Add(AnsiString(WideString(bURL)));
              pAnchor->Release();
            }
            pItem->Release();
          }
        }
      }
      pAnchors->Release();
    }
  }
}
//---------------------------------------------------------------------------



Screenshot des Beispielprogramms
Screenshot des Beispielprogramms


  Download BCB6
Projekt-Quellcode
Download
Demo-Exe

© '99-2002 by S. Kreutzmann