IWebBrowser2 / CHtmlView / CWebBrowser2 是 MFC/ATL 應用程式內嵌瀏覽器功能的核心。本文匯總五項實用進階技巧,助你突破「單純瀏覽網頁」的侷限。
適用場景:HTML 內容加密、動態生成、避免臨時檔案。核心介面:IPersistStreamInit。
// 1. 導航至 about:blank 取得有效 Document 物件
m_ie.Navigate2(&CComVariant(_T("about:blank")), NULL, NULL, NULL, NULL);
// 2. 取得 IHTMLDocument2
CComPtr<IDispatch> spDoc = m_ie.GetDocument();
CComQIPtr<IPersistStreamInit, &IID_IPersistStreamInit> spPSI(spDoc);
// 3. 將 HTML 字串轉為 IStream
LPTSTR lpMem = (LPTSTR)::GlobalAlloc(GPTR, lstrlen(lpHtml) + 1);
lstrcpy(lpMem, lpHtml); // lpHtml 為你的 HTML 字串
CComPtr<IStream> spStream;
CreateStreamOnHGlobal(lpMem, TRUE, &spStream);
// 4. 載入並顯示
spPSI->InitNew();
spPSI->Load(spStream);
替代方案:res: 協議 — 將 HTML/圖片加入專案資源 (自訂資源類型 HTML),直接導航至 res://YourModule.dll/HTML_RESOURCE_NAME。RC 檔手工編輯範例:
HTML_TOWORD HTML DISCARDABLE "res\ToWord.htm"
~SEND_R1_C1.GIF HTML DISCARDABLE "res\~Send_r1_c1.gif"
LOGO.GIF HTML DISCARDABLE "res\Logo.gif"
實作 IDocHostUIHandler::ShowContextMenu,回傳 S_OK 即攔截預設菜單。ATL 實作較簡潔;MFC 需參考 Microsoft 範例程式碼 (文中已移植)。
CCmdTarget 的 Automation 類別 (勾選 Automation),用 ClassWizard 加入方法/屬性。IDocHostUIHandler::GetExternal 回傳該物件的 IDispatch。window.external.YourMethod()。呼叫 MSHTML.DLL 匯出函式 ShowHTMLDialogEx (VC6 需自行宣告):
HRESULT ShowHTMLDialogEx(
HWND hwndParent, // 父視窗
IMoniker* pMk, // URL 命名物件 (CreateURLMoniker 產生)
DWORD dwDialogFlags, // HTMLDLG_MODAL | HTMLDLG_NOUI 等
VARIANT* pvarArgIn, // 輸入參數 → 腳本取 window.dialogArguments
WCHAR* pchOptions, // 樣式字串 "dialogWidth:400px; dialogHeight:300px;"
VARIANT* pvarArgOut // 輸出參數 ← 腳本設 window.returnValue
);
關鍵旗標:HTMLDLG_NOUI — 不顯示對話框,僅載入 HTML 執行腳本 (配合技巧五)。
範例對話框 HTML (html_dlg.htm) 含表單輸入,使用者按確定後將資料回傳主程式。
呼叫 ShowHTMLDialogEx 並傳入 HTMLDLG_NOUI,即可載入 HTML 並執行其中腳本,不顯示視窗。範例腳本 (ToWord.htm):
<script language="VBScript">
On Error Resume Next
Set wordapp = CreateObject("Word.Application")
If Err.Number <> 0 Then
MsgBox "未安裝 MS Word"
Else
wordapp.Visible = True
wordapp.Documents.Add "", False, 0
wordapp.Selection.TypeText window.dialogArguments ' 接收主程式傳入文字
End If
window.close
</script>
串聯流程:主程式彈出 HTML 對話框 (技巧四) → 使用者輸入文字 → 按確定回傳 → 主程式呼叫 ShowHTMLDialogEx(HTMLDLG_NOUI) 執行 Word 自動化腳本 (技巧五)。



ShowHTMLDialogEx 宣告、常數與庫連結 (Urlmon.lib);VC.NET 已內建。本文配套完整 VC6 範例專案可供下載。