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

VC++ 調用網頁端 JavaScript:IHTMLWindow2::execScript 完整代碼片段

     編輯:VC 教學

在 VC++ 應用中嵌入 WebBrowser 控件 (CHtmlView 或 ActiveX WebBrowser) 後,常需從 C++ 呼叫頁面內的 JavaScript 函數。本文提供標準 COM 介面調用代碼:獲取 IHTMLDocument2 → IHTMLWindow2 → execScript 執行 JS 代碼並可選取得返回值。

核心代碼


// 假設 m_browser 為 CWebBrowser2 或 CHtmlView 成員
// 1. 獲取 Document 介面
CComPtr pDisp;
m_browser->get_Document(&pDisp);
if (!pDisp) return;

CComPtr pDoc;
pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc);
if (!pDoc) return;

// 2. 獲取 Window 介面 (執行腳本上下文)
CComPtr pWin;
pDoc->get_parentWindow(&pWin);
if (!pWin) return;

// 3. 構建 JS 代碼字串 (可含參數)
CString jsCode;
jsCode.Format(_T("CategHandle('%d','%s','%d','yes')"), 
              g_nGroupIndex + 1, dlg.m_vFileGroup[g_nGroupIndex].strGroup, dlg.m_vFileGroup.size());

// 4. 執行腳本
CComBSTR bstrCode(jsCode);
CComBSTR bstrLang(_T("JavaScript")); // 或 JScript
VARIANT varResult; VariantInit(&varResult);

HRESULT hr = pWin->execScript(bstrCode, bstrLang, &varResult);
if (SUCCEEDED(hr)) {
    // varResult 為 JS 返回值 (若函數有 return)
    // 可轉換: CString ret = (BSTR)varResult.bstrVal;
}

關鍵介面說明

介面來源用途
IWebBrowser2::get_DocumentWebBrowser 控件獲取當前文檔的 IDispatch
IHTMLDocument2MSHTML.dllDOM 文檔操作核心介面
IHTMLDocument2::get_parentWindowMSHTML獲取 IHTMLWindow2 (window 物件)
IHTMLWindow2::execScriptMSHTML在窗口上下文執行腳本代碼

注意事項

  1. 腳本引擎: bstrLang 傳 L\"JavaScript\" 或 L\"JScript\" (IE 內建),VBScript 需系統支援。
  2. 跨域限制: 若頁面包含跨域 iframe,execScript 可能因同源策略失敗。
  3. 非同步載入: 必須在 DocumentComplete 事件後調用,確保 DOM 就緒。
  4. 返回值處理: VARIANT 類型視 JS 返回值而定 (VT_BSTR, VT_I4, VT_BOOL, VT_DISPATCH 等),需安全轉換。
  5. 替代方案: IHTMLWindow2::eval (僅評估運算式)、IDispatch::Invoke 直接呼叫 JS 函數 (需 DISPID),execScript 最通用。

反向調用:JS 呼叫 C++

若需 JS 主動呼叫 C++,可實現 IDispatch 介面的 C++ 物件,並透過 IHTMLWindow2::set_property 或 window.external (需 IDocHostUIHandler::GetExternal) 暴露給 JS。此為另一主題。

此片段適用於所有嵌入 MSHTML/WebBrowser 的 VC++ 專案 (MFC/ATL/WTL/純 SDK)。

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