附上上篇文章----C++调用JS:http://www.cnblogs.com/aishangxue/p/3397781.html
JS可以调用C++编写的函数,需要以下步骤:
1)定义一个组件类,需要实现IDispatch接口。
2)在GetExternal 函数中返回上面定义组件。
3)在定义的组件类中实现GetIDsOfNames,
GetIDsOfNames( __RPC__in REFIID riid, __RPC__in_ecount_full(cNames ) LPOLESTR *rgszNames, UINT cNames, LCID lcid, __RPC__out_ecount_full(cNames) DISPID *rgDispId )其中rgszNames是JS中调用的名称,我们需要用rgDispId返回需要被调用方法的ID。
返回S_OK代表成功找到。
4)实现Invoke方法,
Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr )其中dispIdMember是调用方法的ID(与上步中利用rgDispId传回的ID值对应),如果传入的是JS调用的方法ID,则调用相应的C++函数即可。
例如我需要在JS中调用这个方法
window.external.MyMethod();下面具体贴出来DUILIB 中 的WebBrowser实现:
1 STDMETHODIMP CWebBrowserExUI::GetExternal( IDispatch** ppDispatch ) 2 { 3 *ppDispatch = this; 4 return S_OK; 5 }1 HRESULT STDMETHODCALLTYPE CWebBrowserExUI::GetIDsOfNames( __RPC__in REFIID riid, __RPC__in_ecount_full(cNames ) LPOLESTR *rgszNames, UINT cNames, LCID lcid, __RPC__out_ecount_full(cNames) DISPID *rgDispId ) 2 { 3 //DISP ID 从200开始 4 if(_tcscmp(rgszNames[0],_T("MyMethod")) == 0){ 5 *rgDispId = 200; 6 return S_OK; 7 } 8 return __super::GetIDsOfNames(riid,rgszNames,cNames,lcid,rgDispId); 9 }1 STDMETHODIMP CWebBrowserExUI::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr ) 2 { 3 if ((riid != IID_NULL)) 4 return E_INVALIDARG; 5 6 switch(dispIdMember) 7 { 8 case 200: 9 MyMethod(); 10 break; 11 } 12 13 return __super::Invoke(dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr); 14 } 15 16 void CWebBrowserExUI::MyMethod(){ 17 18 }参考:http://www.cnblogs.com/lucc/archive/2010/11/24/1886087.html