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();
}
}
}
//---------------------------------------------------------------------------
|