我们经常会遇到,将脚本中定义的多个参数打包到一个数组中,然后将这个数组传给一个组件方法。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接口,我们就可以通过GetNextDispID、GetMemberName和InvokeEx三个方法实现对数组的遍历。
- VARIANT varParams; //这是脚本传入的参数数组
- //如果传入的类型不是VT_DISPATCH就退回出错信息
- if(varParams.vt!=VT_DISPATCH)
- return E_INVALIDARG;
- //取得IDispatchEx接口
- CComPtr<IDispatchEx> pDispEx;
- HRESULT hr=varParams.pdispVal->QueryInterface(IID_IDispatchEx,(void**)&pDispEx);
- if(FAILED(hr))
- return E_INVALIDARG;
- //枚举所有的属性
- DISPID dispid;
- //取得第一个元素的DISPID
- hr = pDispEx->GetNextDispID(fdexEnumAll, DISPID_STARTENUM, &dispid);
- while (hr == NOERROR)
- {
- //元素名称
- CComBSTR bstrName;
- hr = pDispEx->GetMemberName(dispid, &bstrName);
- if (FAILED(hr))
- return E_FAIL;
- //元素值
- CComVariant vValue;
- DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
- hr = pDispEx->InvokeEx(dispid, LOCALE_USER_DEFAULT,
- DISPATCH_PROPERTYGET, &dispparamsNoArgs,
- &vValue, NULL, NULL);
- if(FAILED(hr))
- return E_FAIL;
- //取得下一个元素的DISPID
- hr = pDispEx->GetNextDispID(fdexEnumAll, dispid, &dispid);
- }