javascript 调用c++

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:04   1359   0


网页调用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中的参数是倒序

下面附上一些简单的用例:

 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;  
 } 



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP