C++和JS的交互2 - Invoke

近关于vc++里面通过IDispatch的Invoke来实现和js的交互做点了tp,并且对以前不了解的“直接读取js变量值”和“传递多个参数”的部分重新实现了下。

1,调用js的函数,并传递多个参数

[c-sharp]  view plain  copy
  1. CComQIPtr<IHTMLDocument2> pDoc = m_browser.get_Document();  
  2.   
  3.     if (pDoc)  
  4.     {  
  5.         CComQIPtr<IDispatch> spDisp;  
  6.         HRESULT hr = pDoc->get_Script(&spDisp);  
  7.         if (SUCCEEDED(hr))  
  8.         {  
  9.                            //要调用的函数名  
  10.             TCHAR* szMember = _T("setText");  
  11.             DISPID dispid;  
  12.             HRESULT hr = spDisp->GetIDsOfNames(IID_NULL, &szMember, 1,  
  13.                 LOCALE_SYSTEM_DEFAULT, &dispid);  
  14.   
  15.             if (SUCCEEDED(hr))  
  16.             {  
  17.                 DISPPARAMS dispparams;  
  18.                 memset(&dispparams, 0, sizeof dispparams);  
  19.                 dispparams.cArgs = 2;  
  20.                 //要传递的参数,注意强烈推荐用下面这个形式。传送string的时候,改为BSTR就可以。  
  21.                                     CComVariant* pvars = new CComVariant[2];     
  22.                 pvars[1] = L"1";       
  23.                 pvars[0] = L"2";     
  24.                 pvars[0].ChangeType(VT_I4);  
  25.                 pvars[1].ChangeType(VT_I4);  
  26.                 dispparams.rgvarg = pvars;  
  27.   
  28.                 dispparams.cNamedArgs = 0;  
  29.                 EXCEPINFO excepInfo;  
  30.                 memset(&excepInfo, 0, sizeof(excepInfo));  
  31.                 CComVariant vaResult;  
  32.                 UINT nArgErr = (UINT)-1;  // initialize to invalid arg  
  33.                 hr = spDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,  
  34.                                     &dispparams,  
  35.                                     &vaResult,  
  36.                                     &excepInfo,  
  37.                                     &nArgErr);  
  38.             }  
  39.         }  
  40.     }  

 

2,直接读取js的变量(不是通过对某个控件赋值再读取的形式)

[c-sharp]  view plain  copy
  1. CComQIPtr<IHTMLDocument2> pDoc = m_browser.get_Document();  
  2.   
  3.     if (pDoc)  
  4.     {  
  5.         CComQIPtr<IDispatch> spDisp;  
  6.         HRESULT hr = pDoc->get_Script(&spDisp);  
  7.         if (SUCCEEDED(hr))  
  8.         {  
  9.                            //js中的变量名字  
  10.             TCHAR* szMember = _T("nItem");  
  11.             DISPID dispid;  
  12.             HRESULT hr = spDisp->GetIDsOfNames(IID_NULL, &szMember, 1,  
  13.                 LOCALE_SYSTEM_DEFAULT, &dispid);  
  14.   
  15.             if (SUCCEEDED(hr))  
  16.             {  
  17.                 DISPPARAMS dispparams;  
  18.                 memset(&dispparams, 0, sizeof dispparams);  
  19.                 EXCEPINFO excepInfo;  
  20.                 memset(&excepInfo, 0, sizeof(excepInfo));  
  21.                 CComVariant vaResult;  
  22.                 UINT nArgErr = (UINT)-1;  // initialize to invalid arg  
  23.                 hr = spDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,   
  24.                     DISPATCH_PROPERTYGET,  
  25.                     &dispparams,  
  26.                     &vaResult,  
  27.                     &excepInfo,  
  28.                     &nArgErr);  
  29.   
  30.             }  
  31.         }  
  32.     }  

 

可惜对js的变量直接赋值的时候,Invoke一直不能成功,还有待于继续调查。。。。。

0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值