我們經常會遇到,將指令碼中定義的多個參數打包到一個數組中,然後將這個數組傳給一個組件方法。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);
- }