网页调用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;
}
|