首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

利用 IE COM 介面提取網頁所有超連結:IHTMLDocument2 實戰

     編輯:關於C語言

在 Windows 桌面應用中嵌入 WebBrowser 控制項或自動化 Internet Explorer 時,常需提取當前網頁的所有超連結(``)。本文說明使用標準 COM 介面 IHTMLDocument2、IHTMLElementCollection、IHTMLAnchorElement 逐步枚舉並取得 href 與 hostname 的完整流程與程式碼片段。

核心 COM 介面鏈路

  1. IWebBrowser2::get_Document → 取得 IDispatch*,QueryInterface 為 IHTMLDocument2。
  2. IHTMLDocument2::get_links → 返回所有 `` 元素的集合 IHTMLElementCollection。
  3. IHTMLElementCollection::get_length → 取得連結總數。
  4. IHTMLElementCollection::item(index, index) → 取得單一元素的 IDispatch*,QueryInterface 為 IHTMLAnchorElement。
  5. IHTMLAnchorElement::get_href / get_hostname → 取得完整 URL 與主機名。

關鍵程式碼實作 (ATL 智慧指標版)

// 假設已有 IWebBrowser2* spBrowser
CComPtr<IDispatch> spDispatch;
CComQIPtr<IHTMLDocument2> pDoc2;

if (SUCCEEDED(spBrowser->get_Document(&spDispatch))) {
    pDoc2 = spDispatch; // 自動 QI
    if (pDoc2) {
        CComPtr<IHTMLElementCollection> pElementCol;
        if (SUCCEEDED(pDoc2->get_links(&pElementCol))) {
            long nCount = 0;
            if (SUCCEEDED(pElementCol->get_length(&nCount)) && nCount > 0) {
                for (long i = 0; i < nCount; ++i) {
                    CComVariant idx(i);
                    CComPtr<IDispatch> spItemDisp;
                    if (SUCCEEDED(pElementCol->item(idx, idx, &spItemDisp))) {
                        CComQIPtr<IHTMLAnchorElement> pAnchor(spItemDisp);
                        if (pAnchor) {
                            CComBSTR bstrHref, bstrHost;
                            pAnchor->get_href(&bstrHref);
                            pAnchor->get_hostname(&bstrHost);
                            // 將 bstrHref / bstrHost 轉為 CString 或 std::string 存入列表
                            // 例:m_LinksList.InsertItem(i, CString(bstrHref));
                        }
                    }
                }
            }
        }
    }
}

實戰注意事項

  • 文檔就緒狀態: 必須確認 IWebBrowser2::get_ReadyState == READYSTATE_COMPLETE 且 Document 非空,否則提取會失敗或不完整。
  • 跨域限制: 若頁面包含 `