添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
风流的冰淇淋  ·  ConnectionNotFoundErro ...·  1 月前    · 
活泼的扁豆  ·  Kafka:CorruptRecordExc ...·  2 月前    · 
腼腆的柑橘  ·  Gitlab CE: ...·  1 年前    · 

附上上篇文章----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 )
3     *ppDispatch = this;
4     return S_OK;
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 )
3     //DISP ID 从200开始
4     if(_tcscmp(rgszNames[0],_T("MyMethod")) == 0){
5         *rgDispId = 200;
6         return S_OK;
8     return __super::GetIDsOfNames(riid,rgszNames,cNames,lcid,rgDispId);
 1 STDMETHODIMP CWebBrowserExUI::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr )
 3     if ((riid != IID_NULL))
 4         return E_INVALIDARG;
 6     switch(dispIdMember)
 8     case 200:
 9         MyMethod();
10         break;
11     }
13     return __super::Invoke(dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
14 }
16 void CWebBrowserExUI::MyMethod(){

参考:http://www.cnblogs.com/lucc/archive/2010/11/24/1886087.html