載入網頁的 IWebBrowser2 控制項內部持有文件物件模型 (DOM)。透過 IHTMLDocument2::get_links 取得 IHTMLElementCollection,列舉其中的 IHTMLAnchorElement,即可取得每個 <a> 標籤的 href、hostname 等屬性。
void CMyClass::ExtractAllLinks()
{
// 清空現有列表
int n = m_LinksList.GetItemCount();
for (int i = 0; i < n; ++i) {
IWebBrowser2* pBr = (IWebBrowser2*)m_LinksList.GetItemData(i);
if (pBr) pBr->Release();
}
m_LinksList.DeleteAllItems();
m_LinksNum = 0;
UpdateData(FALSE);
if (!m_spSHWinds) return; // IShellWindows 介面指標
long count = 0;
m_spSHWinds->get_Count(&count);
for (long i = 0; i < count; ++i) {
_variant_t vIdx(i);
IDispatchPtr spDisp;
m_spSHWinds->Item(vIdx, &spDisp);
if (!spDisp) continue;
SHDocVw::IWebBrowser2Ptr spBrowser(spDisp); // QueryInterface
if (!spBrowser) continue;
// 取得文件物件
IDispatchPtr spDocDisp;
if (FAILED(spBrowser->get_Document(&spDocDisp))) continue;
CComQIPtr pDoc2(spDocDisp);
if (!pDoc2) continue;
// 取得連結集合
CComPtr spLinks;
if (FAILED(pDoc2->get_links(&spLinks))) continue;
long linkCount = 0;
spLinks->get_length(&linkCount);
if (linkCount == 0) continue;
m_LinksNum += linkCount;
UpdateData(FALSE);
for (long j = 0; j < linkCount; ++j) {
_variant_t vIdx2(j), vIdx3(j);
IDispatchPtr spElemDisp;
if (FAILED(spLinks->item(vIdx2, vIdx3, &spElemDisp))) continue;
CComQIPtr spAnchor(spElemDisp);
if (!spAnchor) continue;
BSTR bstrHref = NULL, bstrHost = NULL;
spAnchor->get_href(&bstrHref);
spAnchor->get_hostname(&bstrHost);
TCHAR szBuf[2 * MAX_PATH] = {0};
if (bstrHref) {
_tcscpy_s(szBuf, _bstr_t(bstrHref));
int nItem = m_LinksList.InsertItem(j, szBuf);
m_LinksList.SetCheck(nItem, TRUE);
SysFreeString(bstrHref);
}
if (bstrHost) {
_tcscpy_s(szBuf, _bstr_t(bstrHost));
if (_tcslen(szBuf))
m_LinksList.SetItemText(j, 1, szBuf);
SysFreeString(bstrHost);
}
}
}
}
IShellWindows 可列舉系統所有 IE/資源管理員視窗,適合做類似「網際快車」的全域連結抓取工具。CComPtr, CComQIPtr, _variant_t, _bstr_t):自動管理 COM 參考計數、VARIANT/BSTR 生命週期,避免洩漏。CoMarshalInterThreadInterfaceInStream 封送。mshtml.tlb 版本。IHTMLImgElement (get_images) 下載所有圖片。IHTMLScriptElement 分析頁面腳本。IHTMLElement::get_innerHTML/outerHTML 做內容離線存檔。完整專案包含列表控制項顯示、勾選下載等功能:
本文配套源碼