您好,请问为什么用VBArray()将ATL COM中返回的数组类型变量转换为Javascript的数组时说缺少VBArray?谢谢。
以下是javascript脚本和COM中的代码。在VB中没有问题,但是在javascript中不能实现,谢谢。
<script language="javascript" type="text/javascript">
    window.onload=initAll
    function initAll(){
       var comObj=new ActiveXObject("ATLTest2.test1");
       VBArrayTest(comObj.GetArray());         
    }
            function VBArrayTest(vbarray)
            {
              var b=new Array(3);
              var a= new VBArray(vbarray);//这里出错。
              b = a.toArray();
              var i;
              for (i = 0; i < 3; i++) 
              {
                 alert(b[i]);
              }
            }
       </script>
STDMETHODIMP Ctest1::GetArray(VARIANT* aName)
{
    SAFEARRAY *psa;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].cElements =3;
    rgsabound[0].lLbound = 0;
    psa = SafeArrayCreate(VT_BSTR,1,rgsabound);
    BSTR *buf;
    SafeArrayAccessData(psa, (void **)&buf);
    buf[0]=_T("Can ");
    buf[1]=_T("You ");
    buf[2]=_T("Me ");
    SafeArrayUnaccessData(psa);
    (*aName).vt = VT_ARRAY|VT_BSTR;
    (*aName).parray = psa;
    return S_OK;
}

解决方案 »

  1.   

    buf[0]=SysAllocString(OLESTR("Can ")); 
    buf[1]=SysAllocString(OLESTR("You ")); 
    buf[2]=SysAllocString(OLESTR("Me "));
      

  2.   

     BSTR *buf; 应该是BSTR buf[3];
     谢谢。
      

  3.   

    回复:jameshooo
    您这种方法不仅在javascript中仍然是“运行时错误,缺少VBArray”,
    同时在VB中也无法通过函数返回数组,谢谢。
      

  4.   

    我怀疑脚本代码中的某个地方把VBArray对象给干掉了,比如使用了 VBArray = null; 或者 VBArray = otherthing;
    你使用typeof VBArray检测看看。
      

  5.   

    回复:jameshooo 
    alert(typeof VBArray) 显示 function
    咋办?
      

  6.   

    直接用 var b = new VBArray(vbarray).toArray(); 试试
      

  7.   

    回复:jameshooo
     var b = new VBArray(comObj.GetArray()).toArray();
    不行,还是那个错误。是不是我atl写错了,您以前写过吗?可以给我参考参考吗?呵呵,谢谢。
      

  8.   

    写过,没发生过你说的问题,首先你的ATL代码肯定是有问题的,1楼就列出了问题。VBArray指的就是safearray,Array代表的是一种可通过命名下标来检索数据的枚举类型(实现了IDispatch),所以它们之间需要转换。
      

  9.   

    好吧,谢谢,我也觉得是ATL写错了。