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

C++Builder CppWebBrowser 動態設定 HTML 內容完整實現

     編輯:關於C++

需求

在 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)
}

關鍵技術點解析

  1. IPersistStreamInit:ActiveX 文檔持久化介面,支援從 IStream 載入。
  2. CreateStreamOnHGlobal:將 HGLOBAL 記憶體區塊包裝為 IStream,fDeleteOnRelease=TRUE 讓 Stream 釋放時自動 GlobalFree。
  3. OleCheck:C++Builder 封裝的 HRESULT 檢查宏,失敗拋出異常。
  4. 異常安全:嵌套 try-catch 確保介面指標正確 Release (此處用 delete 對應智慧指標語義)。
  5. Document 就緒檢查:需在 DocumentComplete 事件後或確認 Document != NULL 時調用。

使用範例


AnsiString html = "

Hello, CppWebBrowser!

"; SetHtml(CppWebBrowser1, html);

常見問題排查

  • Document 為 NULL:在 OnDocumentComplete 事件中調用,或先 Navigate("about:blank") 等待載入。
  • 編碼問題:HTML 字串建議使用 UTF-8,並在 HTML 中宣告 <meta charset="utf-8">。
  • 腳本錯誤:設定 Silent = true 抑制腳本錯誤對話框。

結語

透過 IPersistStreamInit::Load 配合 CreateStreamOnHGlobal,實現無檔案、無 URL 的純記憶體 HTML 注入,適合動態報表、預覽、編輯器等場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved