javascript 调用c++
2015-10-22 19:02
573 查看
网页调用C++的函数,首先需要在重载几个函数:
A HRESULT STDMETHODCALLTYPE GetExternal( /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch ) ;
B STDMETHODIMP Invoke( DISPID dispIdMember, REFIID riid, LCID lcid,WORD wFlags, DISPPARAMS* pDispParams,VARIANT* pVarResult, EXCEPINFO* pExcepInfo,UINT* puArgErr ) ;
C STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid,DISPID *rgDispId );
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
JS调用C++函数,系统会调用GetIDsOfNames来用函数名取得函数的DISPID,然后调用Invoke完成真正的调用,需要注意的是Invoke的pDispParams中的参数是倒序的
下面附上一些简单的用例:
A HRESULT STDMETHODCALLTYPE GetExternal( /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch ) ;
B STDMETHODIMP Invoke( DISPID dispIdMember, REFIID riid, LCID lcid,WORD wFlags, DISPPARAMS* pDispParams,VARIANT* pVarResult, EXCEPINFO* pExcepInfo,UINT* puArgErr ) ;
C STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid,DISPID *rgDispId );
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
JS调用C++函数,系统会调用GetIDsOfNames来用函数名取得函数的DISPID,然后调用Invoke完成真正的调用,需要注意的是Invoke的pDispParams中的参数是倒序的
下面附上一些简单的用例:
STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid,DISPID *rgDispId ) { HRESULT hr = S_OK; for (int i = 0; i < (int)cNames; i++) { CString cszName = rgszNames[i]; if(cszName == L"SeeMemberInfo") { rgDispId[i] = 1; break; } if(cszName == L"AddToGroup") { rgDispId[i] = 2; break; } if(cszName == L"LeaveRoom") { rgDispId[i] = 3; break; }else{ // // One or more are unknown so set the return code accordingly hr = ResultFromScode(DISP_E_UNKNOWNNAME); rgDispId[i] = DISPID_UNKNOWN; } } return hr; } STDMETHODIMP Invoke( DISPID dispIdMember, REFIID riid, LCID lcid,WORD wFlags, DISPPARAMS* pDispParams,VARIANT* pVarResult, EXCEPINFO* pExcepInfo,UINT* puArgErr ) { if (!pDispParams) return E_INVALIDARG; if(wFlags & DISPATCH_METHOD) { switch(dispIdMember) { //被调用函数对应的ID case 1: { BSTR temp=pDispParams->rgvarg[0].bstrVal; std_string params; params.Assign(temp); if(params.Contains("'")){ params.Replace("'",""); } SendRequest_SeeMemberInfo_FromServer(params); break; } case 2: { BSTR temp=pDispParams->rgvarg[0].bstrVal; std_string params; std::vector<std_string> v_temp; params.Assign(temp); if(!params.empty()){ params.Split(v_temp,"|"); if(v_temp.size()>3){ SendRequest_AddToGroup_FromServer(user_id,user_nickname,v_temp[1],v_temp[3],v_temp[2]); } } break; } case 3: { BSTR temp=pDispParams->rgvarg[0].bstrVal; std_string gOwnerID,params; std::vector<std_string> v_temp; params.Assign(temp); if (params.Contains("_")) { params.Split(v_temp,"_"); if(v_temp.size()>=2){ gOwnerID.Assign(v_temp[1]); if(!gOwnerID.empty()){ SendRequest_DelFromGroup_FromServer(gOwnerID,user_id,user_nickname,m_UserServername); } } } break; } default: return DISP_E_MEMBERNOTFOUND; break; } } return S_OK; } HRESULT STDMETHODCALLTYPE GetExternal( /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch ) { *ppDispatch=(IDispatch*)this; return S_OK; }
相关文章推荐
- 解决js(ajax)提交后端的“ _xsrf' argument missing from POST” 的错误
- JavaScript基础知识的总结
- (二)学习seajs模块定义和模块引用相关API
- Ext JS 学习&Tips
- JS错误Uncaught SyntaxError: Unexpected token < 分析及解决方法
- [JS]js判断值是否为空的代码写法示例
- JS鼠标滑轮事件的写法和按键的事件
- 用JS获取地址栏参数的方法(超级简单)
- 二、JavaScript语言--JS实践--信息滚动效果制作
- 详解Javascript 函数声明和函数表达式的区别
- JS中设置定时刷新setInterval函数
- 站长统计js代码
- [Ext JS 4] 实战之多选下拉单 (带checkbox)
- JavaScript的命名空间
- <<JavaScript编程全解>>阅读笔记之javascript数据类型
- 一个简单的js求和
- 简单的分页js代码
- 点滴记录ExtJS练习——ComboBox的四种扩展
- 【JSON】Jackson初学,及常用的例子
- js动态删除增加dom元素