來自:清泛網 - http://www.tsingfun.com/html/2015/dev_0826/CDHtmlDialog_cpp_call_js_interactive.html
《CDHtmlDialog的基本使用(JS調用C++函數的實現)》
本文基於以上文章,在其代碼基礎上拓展:
一、在主對話方塊上添加一個C++按鈕,步驟如下:
運行效果如下:
二、為C++按鈕添加調用Js的代碼:
JSCppInteractive.htm中添加一個js函數供C++調用,代碼如下:
<script type="text/javascript">function CppCallJsFunc() { alert("JS alert彈出框。");}</script>
JSCppInteractiveDlg.h末尾添加如下代碼:
HRESULT CallJSFunction(IHTMLDocument2* pDoc2,CString strFunctionName,DISPPARAMS dispParams,VARIANT* varResult,EXCEPINFO* exceptInfo,UINT* nArgErr );public:afx_msg void OnBnClickedButton1();
JSCppInteractiveDlg.cpp末尾添加如下代碼:
void CJSCppInteractiveDlg::OnBnClickedButton1(){// TODO: 在此添加控制項通知處理常式代碼IHTMLDocument2* pDoc = NULL;CDHtmlDialog::GetDHtmlDocument(&pDoc);DISPPARAMS param = {0};VARIANT vtRet;CallJSFunction(pDoc, _T("CppCallJsFunc"), param, &vtRet, NULL, NULL);}HRESULT CJSCppInteractiveDlg::CallJSFunction(IHTMLDocument2* pDoc2, CString strFunctionName, DISPPARAMS dispParams, VARIANT* varResult, EXCEPINFO* exceptInfo, UINT* nArgErr ){IDispatch *pDispScript = NULL;HRESULT hResult;hResult = pDoc2->get_Script(&pDispScript);if(FAILED(hResult)){return S_FALSE;}DISPID dispid; CComBSTR objbstrValue = strFunctionName;BSTR bstrValue = objbstrValue.Copy();OLECHAR *pszFunct = bstrValue ; hResult = pDispScript->GetIDsOfNames(IID_NULL, &pszFunct, 1,LOCALE_SYSTEM_DEFAULT, &dispid);if (FAILED(hResult)) { pDispScript->Release();return hResult;} varResult->vt = VT_VARIANT;hResult = pDispScript->Invoke(dispid,IID_NULL, LOCALE_USER_DEFAULT,DISPATCH_METHOD,&dispParams,varResult,exceptInfo,nArgErr); pDispScript->Release();return hResult;}
最終運行效果如下:
工程代碼點此下載。