MFC中CHtmlView和JS的相互呼叫
阿新 • • 發佈:2019-02-17
沒廢話,直接上步驟:
1、建立一個繼承自CHtmlView的類;
2、建構函式中新增
CNewHtmlView::CNewHtmlView()
{
// 允許自動化
EnableAutomation();
}
3、過載 virtual HRESULT OnGetExternal( LPDISPATCH *lppDispatch);
HRESULT CNewHtmlView::OnGetExternal( LPDISPATCH *lppDispatch ) { // 返回自身的IDispatch介面 *lppDispatch = GetIDispatch(TRUE); return S_OK; }
// JS呼叫C++部分
4、標頭檔案中新增巨集
DECLARE_DISPATCH_MAP
類似DECLARE_MESSAGE_MAP,具體自己Google
5、.cpp中新增介面對映
// 新增供JS呼叫的函式 BEGIN_DISPATCH_MAP(CNewHtmlView, CHtmlView) DISP_FUNCTION(CNewHtmlView, "CB_FunctionInsallApp", CB_FunctionInsallApp, VT_EMPTY, VTS_DISPATCH) DISP_FUNCTION(CNewHtmlView, "CB_FunctionTryPlay", CB_FunctionTryPlay, VT_EMPTY, VTS_DISPATCH) END_DISPATCH_MAP() // 實現 void CNewHtmlView::CB_FunctionInsallApp(IDispatch *pDispVal) { CComDispatchDriver spData = pDispVal; CComVariant varProperty; spData.GetPropertyByName(L"PropertyName",&varProperty) }
說明:DISP_FUNCTION(CNewHtmlView, "JS中呼叫的函式名", C++中對應的函式名稱, 返回值, 引數[多個引數以空格隔開,VTS_DISPATCH一般作為結構體引數])
獲取結構體內容
6、呼叫js函式
HRESULT CNewHtmlView::OnInvokeJS( WPARAM wParam, LPARAM lParam ) { // 組織引數 CArray<CComVariant, CComVariant &> _param; _param.Add( CComVariant("123" )); _param.Add( CComVariant( "456")); CComQIPtr<IHTMLDocument2> _document; m_pBrowserApp->get_Document( (IDispatch **)&_document ); CComDispatchDriver _script; _document->get_Script(&_script); _script.InvokeN("js中函式名稱", &_param[0], param.GetCount()); return S_OK; }
搞定,收工~!