CppWebBrowser 動態設定 HTML 內容完整實現在 C++Builder 中使用 TCppWebBrowser (封裝 WebBrowser ActiveX) 時,需直接以字串方式設定 HTML 內容,而非導航至 URL。
SetHtml 函數
void __fastcall TForm1::SetHtml(TCppWebBrowser* WebBrowser, AnsiString Html) {
if (WebBrowser->Document == NULL) return;
// 1. 分配全域記憶體存放 HTML 字串
HGLOBAL hHTMLText = GlobalAlloc(GPTR, Html.Length() + 1);
if (!hHTMLText) { ShowMessage("GlobalAlloc Error"); return; }
CopyMemory(hHTMLText, Html.c_str(), Html.Length());
// 2. 建立基於 HGLOBAL 的 IStream
IStream* Stream = nullptr;
OleCheck(CreateStreamOnHGlobal(hHTMLText, true, &Stream));
// 3. 取得 IPersistStreamInit 介面並載入
IPersistStreamInit* psi = nullptr;
try {
OleCheck(WebBrowser->Document->QueryInterface(__uuidof(IPersistStreamInit), (void**)&psi));
try {
OleCheck(psi->InitNew()); // 初始化新文檔
OleCheck(psi->Load(Stream)); // 從 Stream 載入 HTML
} catch (...) { delete psi; throw; }
} catch (...) { delete Stream; throw; }
delete psi;
delete Stream;
// 注意:hHTMLText 由 Stream 釋放 (CreateStreamOnHGlobal 參數 fDeleteOnRelease=TRUE)
}
IStream 載入。HGLOBAL 記憶體區塊包裝為 IStream,fDeleteOnRelease=TRUE 讓 Stream 釋放時自動 GlobalFree。try-catch 確保介面指標正確 Release (此處用 delete 對應智慧指標語義)。DocumentComplete 事件後或確認 Document != NULL 時調用。
AnsiString html = "Hello, CppWebBrowser!
";
SetHtml(CppWebBrowser1, html);
OnDocumentComplete 事件中調用,或先 Navigate("about:blank") 等待載入。<meta charset="utf-8">。Silent = true 抑制腳本錯誤對話框。透過 IPersistStreamInit::Load 配合 CreateStreamOnHGlobal,實現無檔案、無 URL 的純記憶體 HTML 注入,適合動態報表、預覽、編輯器等場景。