JS代码:
var arArray = new Array("1","sadf","2","asdff","test");
if( document.stepDemo) document.stepDemo.putVariant(arArray);接口定义:
STDMETHODIMP CXXXXXX::putVariant(VARIANT varArray)
{
HRESULT hr = S_OK;
DWORD nLen = 5;
VARTYPE vt = varArray.vt;
if( vt == VT_DISPATCH )
{
//deal with javascript array

         }
else
{
//deal with vbscript array
}
return S_OK;
}JS传入进来的VARIANT是个VT_DISPATCH类型变量,不知道如何获取到我传进来的字符串数组??
如何获取呢???

解决方案 »

  1.   

    js的数组是一个IDispatch,它的每一个元素都是以其下标为名字的属性。
    比如访问索引0的元素,就先GetIDOfNames( .... L"0", ... ),再用拿到的id调用Invoke,调用的时候用PROPERTY_GET或PROPERTY_SET都可以。
      

  2.   

    LZ试一下把IDL申明成数组
    [helpstring("some method")] HRESULT SomeMethod([in] SAFEARRAY(ItemType)* parameter);
      

  3.   

    to superarhow(苏泊尔耗):
    看了你的方法我如下实现还是没办法得到还数据,不知道是不是我的操作有问题:
    /*-------------------------------------------*/
     UINT nSize = 0;
     HRESULT hr = disp ->GetTypeInfoCount(&nSize);
     DISPPARAMS noArgs = { NULL, NULL, 0, 0 };
     for( int i=0; i<5; i++ )
     {
    CComVariant varIndex(i,VT_I4);
    varIndex.ChangeType(VT_BSTR);
    DISPID dispId;
    hr = disp ->GetIDsOfNames(IID_NULL,&varIndex.bstrVal,1,LOCALE_USER_DEFAULT,&dispId);
    if( FAILED(hr) ) continue;
    CComVariant varResult;
    hr = disp->Invoke( dispId,
      IID_NULL,
      LOCALE_SYSTEM_DEFAULT,
      DISPATCH_PROPERTYGET,
      &noArgs,
      &varResult,
      NULL,
      NULL );
    VARTYPE vt = varResult.vt;
    hr = varResult.ChangeType( VT_BSTR );
    CComBSTR bstrVal = varResult.bstrVal;
     }
    /*---------------------------*/
      

  4.   

    to wylcy() :
    尝试了用SAFEARRAY来定义,似乎接口不支持,我如下定义,编译没通过[helpstring("some method")] HRESULT SomeMethod([in] SAFEARRAY(BSTR)* parameter);
      

  5.   

    to superarhow(苏泊尔耗):
    值可以正确得到了,thanks,刚没以为取到的值错了!