C++和JS的交互2 - Invoke .

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

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

  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.     }    
CComQIPtr<IHTMLDocument2> pDoc = m_browser.get_Document();  
  
    if (pDoc)  
    {  
        CComQIPtr<IDispatch> spDisp;  
        HRESULT hr = pDoc->get_Script(&spDisp);  
        if (SUCCEEDED(hr))  
        {  
                           //要调用的函数名  
            TCHAR* szMember = _T("setText");  
            DISPID dispid;  
            HRESULT hr = spDisp->GetIDsOfNames(IID_NULL, &szMember, 1,  
                LOCALE_SYSTEM_DEFAULT, &dispid);  
  
            if (SUCCEEDED(hr))  
            {  
                DISPPARAMS dispparams;  
                memset(&dispparams, 0, sizeof dispparams);  
                dispparams.cArgs = 2;  
                //要传递的参数,注意强烈推荐用下面这个形式。传送string的时候,改为BSTR就可以。  
                                    CComVariant* pvars = new CComVariant[2];     
                pvars[1] = L"1";       
                pvars[0] = L"2";     
                pvars[0].ChangeType(VT_I4);  
                pvars[1].ChangeType(VT_I4);  
                dispparams.rgvarg = pvars;  
  
                dispparams.cNamedArgs = 0;  
                EXCEPINFO excepInfo;  
                memset(&excepInfo, 0, sizeof(excepInfo));  
                CComVariant vaResult;  
                UINT nArgErr = (UINT)-1;  // initialize to invalid arg  
                hr = spDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,  
                                    &dispparams,  
                                    &vaResult,  
                                    &excepInfo,  
                                    &nArgErr);  
            }  
        }  
    }  

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

  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.     }    
CComQIPtr<IHTMLDocument2> pDoc = m_browser.get_Document();  
  
    if (pDoc)  
    {  
        CComQIPtr<IDispatch> spDisp;  
        HRESULT hr = pDoc->get_Script(&spDisp);  
        if (SUCCEEDED(hr))  
        {  
                           //js中的变量名字  
            TCHAR* szMember = _T("nItem");  
            DISPID dispid;  
            HRESULT hr = spDisp->GetIDsOfNames(IID_NULL, &szMember, 1,  
                LOCALE_SYSTEM_DEFAULT, &dispid);  
  
            if (SUCCEEDED(hr))  
            {  
                DISPPARAMS dispparams;  
                memset(&dispparams, 0, sizeof dispparams);  
                EXCEPINFO excepInfo;  
                memset(&excepInfo, 0, sizeof(excepInfo));  
                CComVariant vaResult;  
                UINT nArgErr = (UINT)-1;  // initialize to invalid arg  
                hr = spDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,   
                    DISPATCH_PROPERTYGET,  
                    &dispparams,  
                    &vaResult,  
                    &excepInfo,  
                    &nArgErr);  
  
            }  
        }  
    }  


原文:http://blog.csdn.net/hzlyh/article/details/5411086

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值