您的位置:首页 > Web前端 > JavaScript

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中的参数是倒序

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: