做了个控件,ATL的,我要返回一个数组,在网页中使用,用法如下:
var arr = xxCtrl.GetArray();我的代码是这样的。
IDL文件
--------------------------------------
[id(3), helpstring("方法GetArray")] HRESULT GetArray([out,retval] VARIANT* arr);xxx.h文件
------------------------------------
//类里面的函数声明
STDMETHOD(GetArray)(VARIANT* arr);xxx.cpp文件
-------------------------------------STDMETHODIMP CHelperCtrl::GetArray(VARIANT* arr)
{
    SAFEARRAYBOUND saBound;
    SAFEARRAY* pSA;
    long index;    saBound.cElements = 2;
    saBound.lLbound = 0;
    pSA = SafeArrayCreate( VT_BSTR, 1, &saBound );
    BSTR bstr0 = SysAllocString(T2OLE(TEXT("item 0")));
    BSTR bstr1 = SysAllocString(T2OLE(TEXT("item 1")));
    index = 0;
    SafeArrayPutElement( pSA, &index, bstr0);
    index ++;
    SafeArrayPutElement( pSA, &index, bstr1);
    SysFreeString( bstr0 );
    SysFreeString( bstr1 );    VariantInit( arr );
    arr->vt = VT_ARRAY | VT_BSTR;
    arr->parray = pSA;
    return S_OK;
}------------------------------------------
以上是控件里的代码,
我的网页脚本是这样写的:
debugger;
jsArr = new Array("1111", "2222");
var arr = document.getElementById('HelperCtrl').GetArray();
alert(arr.length);   //这句有问题我开启了IE脚本调试的功能,对js创建的数组和控件返回的数组作了比较。发现有如下不同,以下是调试时的信息:
     名称    值            类型
--------------------------------------------
-    arr     {...}         数组 String    //类型不是Object
     (0)     "item 0"      String     //访问内部元素的时候是用的()而不是[]
     (1)     "item 1"      String
-    jsArr   {...}         Object
     [0]     "1111"        String
     [1]     "2222222"     String
最后,请问如何才能从控件中获得一个js能够识别的数组呢?

解决方案 »

  1.   

    VBScript can read and produce safearrays of variants, but not of any
    other type. JavaScript can read safearrays of any type with the help of
    VBArray object, but cannot produce any kind of safearray. An Array
    object in JavaScript is not in any way related to a safearray - it's an
    object implementing IDispatch, with each index being a separate
    property. VBArray can convert a safearray to a JavaScript Array, but
    there's no conversion the other way.A preferred way to pass a set of items to scripts is to create a
    collection object.
      

  2.   

    我这样写
    var safeArr= document.getElementById('HelperCtrl').GetArray();
    var vbArr = new VBArray(safeArr);总是说缺少VBArray
      

  3.   

    你不定义,拿一个变量直接当做Array使用呢?会提示什么?
      

  4.   

    下面是vc知识库的文章,你可以参考一下,不过里面不是使用js,不过都差不多啦。
      [问题提出]
      ATL做com,想让一方法返回一数组,我这样声明:……[out,retval]SAFEARRAY** par)出错,为什么?最好能给一简单例子
      [解决方法]
      在COM方法中可用VARIANT类型传递数组数据,在VC++中用SAFEARRAY处理。下面给出输入和输出数组的例子  1。输入数组到COM中
      STDMETHODIMP  CTestCom1::vb2vc(VARIANT  buffer)
      { 
          long  dim=SafeArrayGetDim(buffer.parray);
          long  ubound;
          long  lbound;      SafeArrayGetUBound(buffer.parray,dim,&ubound);
          SafeArrayGetLBound(buffer.parray,dim,&lbound);
          BSTR*  buf;
          BSTR  pd[2];
          SafeArrayAccessData(buffer.parray,(void**)&buf);
          for  (int  i=lbound;i<ubound;i++)
            pd[i]=buf[i];
          }
          return  S_OK;
      }
      buffer为一维数组,存放字符串,在vb中的代码为
            Dim  oo  As  ARRAYTESTLib.TestCom1
            Set  oo  =  New  ARRAYTESTLib.TestCom1
            Dim  buf(2)  As  String
            buf(0)  =  "65"
            buf(1)  =  "anss"
            oo.vb2vc  buf
      
      2。COM返回数组数据到vb  STDMETHODIMP  CTestCom1::retarray(VARIANT  *buffer)
      {
      //返回数组
      SAFEARRAY  FAR*  psa;
      SAFEARRAYBOUND  rgsabound[1];
      rgsabound[0].lLbound=0;
      rgsabound[0].cElements=2;
      psa=SafeArrayCreate(VT_I4,1,rgsabound);  long  idx;
      long  setdt;  idx=0;
      setdt=12;  SafeArrayPutElement(psa,&idx,&setdt);
      idx=1;
      setdt=342;
      SafeArrayPutElement(psa,&idx,&setdt);  V_VT(buffer)  =  VT_ARRAY  |  VT_I4;
      V_ARRAY(buffer)=psa;
      return  S_OK;
      }
      vb中的代码为:
            Dim  oo  As  ARRAYTESTLib.TestCom1
            Set  oo  =  New  ARRAYTESTLib.TestCom1
            Dim  rarr  As  Variant
            oo.retarray  rarr
            MsgBox  rarr(0)  &  rarr(1)