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

VC++ 列舉 IE 視窗獲取 URL 並提取網頁原始碼完整實作

     編輯:關於VC++

透過 SHDocVw.ShellWindows 列舉系統中所有 IE 視窗,配合 MSHTML 解析 DOM,可獲取指定 IE 視窗的 URL 並提取完整網頁原始碼。

核心依賴與匯入

// stdafx.h 或對應頭文件
#import 
#import 

// 命名空間 (視匯入產生的 tlh/tli 而定)
using namespace SHDocVw;
using namespace MSHTML;

完整實作函數

void CGetIESrcDlg::GetRunningIESrc() {
    CoInitialize(NULL);
    IShellWindowsPtr spShellWindows;
    HRESULT hr = spShellWindows.CreateInstance(__uuidof(ShellWindows));
    if (FAILED(hr)) {
        AfxMessageBox(_T("Shell Windows 介面不可用"));
        CoUninitialize();
        return;
    }

    long nCount = spShellWindows->GetCount();
    for (long i = 0; i < nCount; i++) {
        _variant_t vaIndex(i, VT_I4);
        IDispatchPtr spDisp = spShellWindows->Item(vaIndex);
        IWebBrowser2Ptr spBrowser(spDisp);  // QueryInterface 自動轉型
        if (!spBrowser) continue;

        IDispatchPtr spDocDisp;
        if (SUCCEEDED(spBrowser->get_Document(&spDocDisp)) && spDocDisp) {
            IHTMLDocument2Ptr spHtmlDoc(spDocDisp);
            if (!spHtmlDoc) continue;

            // 1. 獲取 URL
            _bstr_t bstrUrl = spBrowser->GetLocationURL();
            AfxMessageBox(CString(bstrUrl));  // 顯示 URL

            // 2. 獲取完整 HTML 原始碼
            IHTMLDocument3Ptr spHtmlDoc3;
            hr = spHtmlDoc->QueryInterface(__uuidof(IHTMLDocument3), (void**)&spHtmlDoc3);
            if (SUCCEEDED(hr) && spHtmlDoc3) {
                IHTMLElementPtr spDocElement;
                hr = spHtmlDoc3->get_documentElement(&spDocElement);
                if (SUCCEEDED(hr) && spDocElement) {
                    BSTR bstrHtml;
                    hr = spDocElement->get_outerHTML(&bstrHtml);
                    if (SUCCEEDED(hr) && bstrHtml) {
                        AfxMessageBox(CString(bstrHtml));  // 顯示完整 HTML
                        SysFreeString(bstrHtml);
                    }
                    spDocElement->Release();
                }
                spHtmlDoc3->Release();
            }
            break;  // 僅處理第一個找到的 IE 視窗 (示範用)
        }
    }
    CoUninitialize();
}

關鍵技術點解析

  1. ShellWindows 列舉:代表所有殼層視窗 (IE/檔案總管),Item(index) 取得 IDispatch
  2. IWebBrowser2:控制 IE 核心介面,get_Document 取得文件物件,GetLocationURL 取得 URL
  3. MSHTML DOM 階層:
    • IHTMLDocument2/3:文件介面
    • get_documentElement:取得 <html> 根元素
    • get_outerHTML:取得含標籤的完整 HTML 字串
  4. COM 智慧指標:_com_ptr_t 衍生類別 (Ptr 後綴) 自動管理 AddRef/Release
  5. BSTR 記憶體管理:SysAllocString/SysFreeString 配對,_bstr_t 為封裝類別

多標籤/現代 IE 版本注意事項

  • IE7+ 多標籤共用一個 IWebBrowser2 進程,需透過 IWebBrowser2::get_HWND 對應視窗控制代碼區分
  • 每個標籤對應一個 IHTMLDocument2,可遍歷 ShellWindows 並比對 HWND 定位特定標籤
  • 大型網頁 outerHTML 可能極大 (MB 級),AfxMessageBox 會卡死,實際應用應寫入檔案或串流處理
  • Edge/Chrome 不支援此機制,僅限 IE/內嵌 WebBrowser 控制項
  • 錯誤處理強化建議

    • 所有 COM 呼叫檢查 HRESULT
    • 介面指標使用前檢查非 NULL
    • CoInitialize/CoUninitialize 配對,考慮 COINIT_APARTMENTTHREADED
    • 異常安全:使用 _com_ptr_t 智慧指標自動釋放
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved