1. 程式人生 > >MFC中CHtmlView和JS的相互呼叫

MFC中CHtmlView和JS的相互呼叫

沒廢話,直接上步驟:


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;
}

搞定,收工~!