MHT (MIME HTML) 可將網頁的 HTML、圖片、CSS、Script 等所有資源封裝成單一檔案。利用 Microsoft CDO (Collaboration Data Objects) 元件的 IMessage::CreateMHTMLBody 方法,可輕鬆實現此功能。
SHDocVw_OCX.h, cdoex.h, msado15.h(BCB 6.0 環境)。using namespace CDO;SaveWholePagevoid __fastcall SaveWholePage(BSTR bstrUrl, BSTR bstrFileName) {
CoInitialize(NULL);
IMessage *pMsg; IConfiguration *pConfig;
CoCreateInstance(__uuidof(Message), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMessage), (void**)&pMsg);
CoCreateInstance(__uuidof(Configuration), NULL, CLSCTX_INPROC_SERVER, __uuidof(IConfiguration), (void**)&pConfig);
pMsg->put_Configuration(pConfig);
try {
pMsg->CreateMHTMLBody(bstrUrl, cdoSuppressNone, L"", L"");
} catch (...) {
ShowMessage("錯誤:無法建立 MHTML 主體");
pMsg->Release(); pConfig->Release(); CoUninitialize(); return;
}
_Stream *pStream;
pMsg->GetStream(&pStream);
pStream->SaveToFile(bstrFileName, adSaveCreateOverWrite);
pStream->Release(); pMsg->Release(); pConfig->Release();
CoUninitialize();
}
void __fastcall TForm1::Button1Click(TObject *Sender) {
SaveWholePage(WideString("https://www.ccrun.com"), WideString("C:\\123.mht"));
}
原理: CDO 內建微型瀏覽器引擎,會下載目標 URL 及其所有參考資源,依 MHTML 標準 (RFC 2557) 組裝成 multipart/related MIME 訊息,再透過 ADO Stream 存檔。適用於網頁歸檔、離線閱讀、報表匯出等場景。
注意:現代網頁大量使用動態載入 (AJAX/Fetch)、Shadow DOM、CSP 限制,CDO 可能無法完整捕獲執行後的 DOM 狀態。複雜頁面建議改用 Headless Chrome (Puppeteer/Playwright) 列印為 PDF 或 MHTML。