vc++访问javascript(3)--遍历javascript中的数组

来源:互联网 发布:集美大学网络服务中心 编辑:程序博客网 时间:2024/06/05 09:02

我们经常会遇到,将脚本中定义的多个参数打包到一个数组中,然后将这个数组传给一个组件方法。javascript和vbscript定义数组的方式是不同的。vbscript中的数组采用的是自动化兼容类型SAFEARRAY,使用VC++中的CComSafeArray类可以很方便的进行遍历。下面我们重点看看javascript中的数组如何进行遍历。

一、javascript脚本中数组的定义

javascript中的数组更像是一个Object对象。在javascript中,可以按数值索引给一个数组元素赋值,也可以通过名称索引给数组元素赋值,如下:

 var oParams=new Object();
 oParams["LoginName"]="test";
 oParams["Password"]="123";
 oParams["VerifyCode"]="12PQ";

这样赋值的好处是,每一个元素都可以标识一个明确的意义。

二、上一篇我们说过Object向外暴露IDispatchEx接口,我们就可以通过GetNextDispIDGetMemberNameInvokeEx三个方法实现对数组的遍历。

  1. VARIANT varParams; //这是脚本传入的参数数组
  2.  //如果传入的类型不是VT_DISPATCH就退回出错信息
  3.  if(varParams.vt!=VT_DISPATCH)
  4.   return E_INVALIDARG;
  5.  //取得IDispatchEx接口
  6.  CComPtr<IDispatchEx> pDispEx;
  7.  HRESULT hr=varParams.pdispVal->QueryInterface(IID_IDispatchEx,(void**)&pDispEx);
  8.  if(FAILED(hr))
  9.   return E_INVALIDARG;
  10.  //枚举所有的属性
  11.  DISPID dispid;
  12. //取得第一个元素的DISPID   
  13. hr = pDispEx->GetNextDispID(fdexEnumAll, DISPID_STARTENUM, &dispid);
  14.     while (hr == NOERROR)
  15.     {
  16.   //元素名称
  17.   CComBSTR bstrName;
  18.         hr = pDispEx->GetMemberName(dispid, &bstrName);
  19.         if (FAILED(hr))
  20.    return E_FAIL;
  21.   //元素值
  22.   CComVariant vValue;
  23.   DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
  24.   hr = pDispEx->InvokeEx(dispid, LOCALE_USER_DEFAULT, 
  25.      DISPATCH_PROPERTYGET, &dispparamsNoArgs, 
  26.      &vValue, NULL, NULL);
  27.   if(FAILED(hr))
  28.    return E_FAIL;
  29.      //取得下一个元素的DISPID   
  30.         hr = pDispEx->GetNextDispID(fdexEnumAll, dispid, &dispid);
  31.  }
原创粉丝点击