duilib JS与C++的相互调用

首先参考了 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);
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值