Chinaunix首页 | 论坛 | 博客
  • 博客访问: 629570
  • 博文数量: 133
  • 博客积分: 1566
  • 博客等级: 上尉
  • 技术积分: 1230
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-01 09:31
文章分类

全部博文(133)

文章存档

2019年(1)

2018年(1)

2017年(8)

2016年(9)

2015年(17)

2014年(4)

2013年(31)

2012年(25)

2011年(36)

2010年(1)

我的朋友

分类: Windows平台

2013-05-29 16:06:45

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

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

点击(此处)折叠或打开

  1. CComQIPtr<IHTMLDocument2> pDoc = m_browser.get_Document();

  2.     if (pDoc)
  3.     {
  4.         CComQIPtr<IDispatch> spDisp;
  5.         HRESULT hr = pDoc->get_Script(&spDisp);
  6.         if (SUCCEEDED(hr))
  7.         {
  8.                            //要调用的函数名
  9.             TCHAR* szMember = _T("setText");
  10.             DISPID dispid;
  11.             HRESULT hr = spDisp->GetIDsOfNames(IID_NULL, &szMember, 1,
  12.                 LOCALE_SYSTEM_DEFAULT, &dispid);

  13.             if (SUCCEEDED(hr))
  14.             {
  15.                 DISPPARAMS dispparams;
  16.                 memset(&dispparams, 0, sizeof dispparams);
  17.                 dispparams.cArgs = 2;
  18.                 //要传递的参数,注意强烈推荐用下面这个形式。传送string的时候,改为BSTR就可以。
  19.                                     CComVariant* pvars = new CComVariant[2];
  20.                 pvars[1] = L"1";
  21.                 pvars[0] = L"2";
  22.                 pvars[0].ChangeType(VT_I4);
  23.                 pvars[1].ChangeType(VT_I4);
  24.                 dispparams.rgvarg = pvars;

  25.                 dispparams.cNamedArgs = 0;
  26.                 EXCEPINFO excepInfo;
  27.                 memset(&excepInfo, 0, sizeof(excepInfo));
  28.                 CComVariant vaResult;
  29.                 UINT nArgErr = (UINT)-1; // initialize to invalid arg
  30.                 hr = spDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,
  31.                                     &dispparams,
  32.                                     &vaResult,
  33.                                     &excepInfo,
  34.                                     &nArgErr);
  35.             }
  36.         }
  37.     }

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

点击(此处)折叠或打开

  1. CComQIPtr<IHTMLDocument2> pDoc = m_browser.get_Document();

  2.     if (pDoc)
  3.     {
  4.         CComQIPtr<IDispatch> spDisp;
  5.         HRESULT hr = pDoc->get_Script(&spDisp);
  6.         if (SUCCEEDED(hr))
  7.         {
  8.                            //js中的变量名字
  9.             TCHAR* szMember = _T("nItem");
  10.             DISPID dispid;
  11.             HRESULT hr = spDisp->GetIDsOfNames(IID_NULL, &szMember, 1,
  12.                 LOCALE_SYSTEM_DEFAULT, &dispid);

  13.             if (SUCCEEDED(hr))
  14.             {
  15.                 DISPPARAMS dispparams;
  16.                 memset(&dispparams, 0, sizeof dispparams);
  17.                 EXCEPINFO excepInfo;
  18.                 memset(&excepInfo, 0, sizeof(excepInfo));
  19.                 CComVariant vaResult;
  20.                 UINT nArgErr = (UINT)-1; // initialize to invalid arg
  21.                 hr = spDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
  22.                     DISPATCH_PROPERTYGET,
  23.                     &dispparams,
  24.                     &vaResult,
  25.                     &excepInfo,
  26.                     &nArgErr);

  27.             }
  28.         }
  29.     }

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

阅读(911) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~