关于网友提出的“ Windows 2003 系统下在COM里如何读取JAVASCRIPT传进来的数组”问题疑问,本网通过在网上对“ Windows 2003 系统下在COM里如何读取JAVASCRIPT传进来的数组”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: Windows 2003 系统下在COM里如何读取JAVASCRIPT传进来的数组描述:
COM编程,2003下如何读取由Javascript传进来的数组?
代码一(在XP下通过,但在2003下出现找不到接口):
IDispatch *pDispatch = pIN->pdispVal;
CComVariant resultV;
HRESULT hRes;
DISPPARAMS noArgs = {NULL,NULL,0,0};
// 开始枚举
hRes = pDispatch->Invoke(DISPID_NEWENUM,IID_NULL,
LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYGET,
&noArgs,&resultV,NULL,NULL);
if(VT_UNKNOWN != resultV.vt && VT_DISPATCH != resultV.vt)
return DISP_E_BADPARAMCOUNT;
CComQIPtr
CComVariant elemV;
pEnum->Reset();
hRes = S_OK;
while(S_OK == hRes)
{
hRes = pEnum->Next(1, &elemV, NULL);
if(elemV.vt != VT_BSTR)
{
hRes =S_FALSE;
}
if(S_OK == hRes)
{
pOut->Add(elemV.bstrVal);
SysFreeString(elemV.bstrVal);
}
}
代码二(同代码一一样,在XP通过,在2003下找不到接口
CComPtr
HRESULT hRes;
hRes = pIN->pdispVal->QueryInterface(IID_IDispatchEx, (void **)&pDispEx);
if(FAILED(hRes))
return hRes;
// 枚举属性
DISPID dispid;
hRes = pDispEx->GetNextDispID(fdexEnumAll, DISPID_STARTENUM, &dispid);
while(NOERROR == hRes)
{
// 元素名
CComBSTR bstrName;
hRes = pDispEx->GetMemberName(dispid, &bstrName);
if(FAILED(hRes))
return E_FAIL;
// 元素值
CComVariant vValue;
DISPPARAMS dispparams = {NULL, NULL, 0, 0};
hRes = pDispEx->InvokeEx(dispid, LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET, &dispparams, &vValue, NULL, NULL);
if(FAILED(hRes))
return E_FAIL;
if(vValue.vt == VT_BSTR)
{
pOut->Add(vValue.bstrVal);
}
// 下一个元素
hRes = pDispEx->GetNextDispID(fdexEnumAll, dispid, &dispid);
}