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 <IEnumVARIANT> pEnum(resultV.punkVal);
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<IDispatchEx> pDispEx;
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);
}

解决方案 »

  1.   

    2003下可能IE的安全级别比较高。1、运行:regeidt ,打开注册表编辑窗口。
    2、找到:HKEY_CURRENT_USER --> Software --> Microsoft --> Window --> Currentversion --> Internet Setting --> Zones --> 3 --> MinLevel
    3、将数值修改为 1000 (16进制)然后降低安全级别
      

  2.   

    哦,不好意思,组件是服务器组件,在客户端访问的调试的时候在Invoke或InvokeEx哪里失败的,错误是找不到接口
      

  3.   

    IDispatch得不到?然后无法invoke?
      

  4.   

    IDispatch可以获得,是无法Invoke