首先参考了 http://www.cnblogs.com/lucc/archive/2010/11/24/1886087.html文章, 感谢前辈的分享!
其二 使用duilib 实现JS与C++的相互调用,duilib 提供了 IE封装的控件 CwebBrowser控件,
继承控件实现JS与C++的相互调用
CWebBrowserEx::CWebBrowserUI
首先继承 GetExternal()
STDMETHOD(GetExternal)(IDispatch** ppDispatch)
{
*ppDispatch=this;
return S_OK;
}
原因不是很清楚,猜测window.external.InPhoneEvent 时 会解析 external,于是调用GetExternal,我们将this传递给网页 ,网页就能找到external.InPhoneEvent对应的函数
用rgszName保存的是JS网页中 window.external.InPhoneEvent 的function对象
函数一:
GetIDsOfNames()
{
if(wcscmp(rgszNames[0], L"InPhoneEvent")==0)
{
*rgDispId = 100;//会在invoke中调用
}
}
函数二:
virtual HRESULT STDMETHODCALLTYPE Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr )
{
__super::Invoke(dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);//调用CWebBrowserUI的Invoke
if( dispIdMember == DISPID_DOCUMENTCOMPLETE)
{
OnDocumentCompleted();
return S_OK;
}
if(dispIdMember == 100)
{
char* argc1 = _com_util::ConvertBSTRToString(pDispParams->rgvarg[2].bstrVal);
char* argc2 = _com_util::ConvertBSTRToString(pDispParams->rgvarg[1].bstrVal);
char* argc3 = _com_util::ConvertBSTRToString(pDispParams->rgvarg[0].bstrVal);
InPhoneEvent(argc1,argc2,argc3);
}
if(dispIdMember == 200)
{
//CppCall();
}
return S_OK;
}
//JS调用对应的C++函数
void InPhoneEvent(LPCSTR eventname,LPCSTR customerNumber, LPCSTR uniqueId)
{
MessageBox(NULL,eventname,customerNumber,0);
}
至此就完成了在duilib中使用JS调用C++
那么使用C++调用JS: 这里我是放在MainFrame实现了,其实放在CWebBrowserEx更好
void ExecPhoneAction(const char* func,const char* param)
{
IHTMLWindow2* pHTMLWnd;
IDispatch * pDispatch=m_pWebBrowser->GetHtmlWindow();
pDispatch->QueryInterface(IID_IHTMLWindow2,(void**)&pHTMLWnd);
if ( pHTMLWnd != NULL )
{
CDuiString strjs="executeAction(\""; //实际调用js里面的executeAction函数
strjs=strjs+func+"\",";
strjs=strjs+param;
strjs=strjs+")";
//const OLECHAR *;
BSTR bstrjs = ::SysAllocString(_bstr_t(strjs.GetData()));
BSTR bstrlan =::SysAllocString(L"javascript");
VARIANT varRet;
if (pHTMLWnd!=NULL)
{
pHTMLWnd->execScript(bstrjs, bstrlan, &varRet);
}
SysFreeString(bstrjs);
SysFreeString(bstrlan);
}
}
其二 使用duilib 实现JS与C++的相互调用,duilib 提供了 IE封装的控件 CwebBrowser控件,
继承控件实现JS与C++的相互调用
CWebBrowserEx::CWebBrowserUI
首先继承 GetExternal()
STDMETHOD(GetExternal)(IDispatch** ppDispatch)
{
*ppDispatch=this;
return S_OK;
}
原因不是很清楚,猜测window.external.InPhoneEvent 时 会解析 external,于是调用GetExternal,我们将this传递给网页 ,网页就能找到external.InPhoneEvent对应的函数
用rgszName保存的是JS网页中 window.external.InPhoneEvent 的function对象
函数一:
GetIDsOfNames()
{
if(wcscmp(rgszNames[0], L"InPhoneEvent")==0)
{
*rgDispId = 100;//会在invoke中调用
}
}
函数二:
virtual HRESULT STDMETHODCALLTYPE Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr )
{
__super::Invoke(dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);//调用CWebBrowserUI的Invoke
if( dispIdMember == DISPID_DOCUMENTCOMPLETE)
{
OnDocumentCompleted();
return S_OK;
}
if(dispIdMember == 100)
{
char* argc1 = _com_util::ConvertBSTRToString(pDispParams->rgvarg[2].bstrVal);
char* argc2 = _com_util::ConvertBSTRToString(pDispParams->rgvarg[1].bstrVal);
char* argc3 = _com_util::ConvertBSTRToString(pDispParams->rgvarg[0].bstrVal);
InPhoneEvent(argc1,argc2,argc3);
}
if(dispIdMember == 200)
{
//CppCall();
}
return S_OK;
}
//JS调用对应的C++函数
void InPhoneEvent(LPCSTR eventname,LPCSTR customerNumber, LPCSTR uniqueId)
{
MessageBox(NULL,eventname,customerNumber,0);
}
至此就完成了在duilib中使用JS调用C++
那么使用C++调用JS: 这里我是放在MainFrame实现了,其实放在CWebBrowserEx更好
void ExecPhoneAction(const char* func,const char* param)
{
IHTMLWindow2* pHTMLWnd;
IDispatch * pDispatch=m_pWebBrowser->GetHtmlWindow();
pDispatch->QueryInterface(IID_IHTMLWindow2,(void**)&pHTMLWnd);
if ( pHTMLWnd != NULL )
{
CDuiString strjs="executeAction(\""; //实际调用js里面的executeAction函数
strjs=strjs+func+"\",";
strjs=strjs+param;
strjs=strjs+")";
//const OLECHAR *;
BSTR bstrjs = ::SysAllocString(_bstr_t(strjs.GetData()));
BSTR bstrlan =::SysAllocString(L"javascript");
VARIANT varRet;
if (pHTMLWnd!=NULL)
{
pHTMLWnd->execScript(bstrjs, bstrlan, &varRet);
}
SysFreeString(bstrjs);
SysFreeString(bstrlan);
}
}