VARIANT CACtestCtrl::cstest(LPCTSTR tum) 
{
VARIANT vaResult;
CString strResult;
VARIANT   vFlag[2]; 
int i;
MessageBox("1111111111111111");
VariantInit(&vaResult);
for (i =0; i < 3; i++)   
{   
VariantInit(&vFlag[i]);   
V_VT(&vFlag[i])   =   VT_BSTR;   
}    SAFEARRAY*   psa;   //build   a   SAFFERRAY   
    SAFEARRAYBOUND   rgsabound[2]; 
rgsabound[0].lLbound   =   0;   
    rgsabound[0].cElements   =   6;   //data   length   by   byte 
rgsabound[1].lLbound   =   0;   
    rgsabound[1].cElements   =   1;   //data   length   by   byte 
    psa   =   SafeArrayCreate(VT_BSTR,   2,   rgsabound);    V_BSTR(&vFlag[0])   =   SysAllocString(OLESTR("111222"));   
V_BSTR(&vFlag[1])   =   SysAllocString(OLESTR("3"));   
long   lZero   =   0;   
long   lOne   =   1;   
SafeArrayPutElement(psa,&lZero,&vFlag[0]);   
SafeArrayPutElement(psa,&lOne,&vFlag[1]);   
vaResult.vt   =   (VT_ARRAY   |    VT_BSTR    );   
vaResult.parray   =   psa;    SafeArrayDestroy(psa);   
// TODO: Add your dispatch handler code here
return vaResult;
}返回2维数组,我在js里面 调用,怎么只能打印出11111111,数组没有显示????
var jsa = new VBArray(document.getElementById("MyActest").cstest(sRet)).toArray();  
alert(jsa); 

解决方案 »

  1.   

    VARIANT  vFlag[2];
    两个元素,
    后面的:
    for (i =0; i < 3; i++)  
    {  
    VariantInit(&vFlag[i]);  
    V_VT(&vFlag[i])  =  VT_BSTR;  
    }  
    访问3个,是个BUG
      

  2.   

    因为psa是二维数组,所以,在设置元素值的时候,也要用两个数字表示一个元素的位置;
    long lZero[]={0,0};
    long lOne[]={0,1};
      

  3.   

    当然,
    SafeArrayPutElement(psa,&lZero,&vFlag[0]);  
    SafeArrayPutElement(psa,&lOne,&vFlag[1]);  
    要改为:
    SafeArrayPutElement(psa,lZero,&vFlag[0]);  
    SafeArrayPutElement(psa,lOne,&vFlag[1]);  
      

  4.   

    下面的代码可能对你有帮助
    //==================================================================================
    //功能说明:将VARIANT newVal(数组)中的数据存储到m_vecClassID中
    //==================================================================================
    STDMETHODIMP CImageClassification::put_ClassifiedIDs(VARIANT newVal)
    {
        // 检查数组元素是否为空
        if (newVal.vt==VT_NULL || newVal.vt== VT_EMPTY)
        {
            return S_FALSE;
        }    // 检查传入参数类型是否为数组
        if (!(newVal.vt & VT_ARRAY))
        {
            return S_FALSE;
        }
        // 声明SafeArray的缓冲区,指向传入参数的数组数据
        SAFEARRAY *psa = newVal.parray;    // 获取数组的维数
        UINT nDims = SafeArrayGetDim(psa);    // 检查数组的维数
        if (nDims != 1)
        {
            return S_FALSE;
        }    // 定义数组元素类型
        VARTYPE vt = 0;    // 获取数组元素类型
        SafeArrayGetVartype(psa,&vt);    // 检查数组元素类型
        if (vt != VT_I4) // long || int
        {
            return S_FALSE;
        }    HRESULT hr;
        int *pData = NULL;    // pData之前不用申请内存空间,可能是下面的函数自动为其申请了
        hr = SafeArrayAccessData(psa,(void **)&pData);     // 用SafeArrayAccessData直接读SafeArray的缓冲区,并将数据保存到内存pData中 
        if (FAILED(hr))
        {
            return S_FALSE;
        }    // 清空m_vecClassID
        m_vecClassID.clear();    // 从内存pData中读取数据,保存到m_vecClassID中
        for (unsigned long index = 0;index < psa->rgsabound[0].cElements;index++)
        {
            m_vecClassID.push_back(pData[index]);
        }    // 释放SafeArray的缓冲区
        SafeArrayUnaccessData(psa); return S_OK;
    }
      

  5.   

    很遗憾,JavaScript不能处理SafeArray的数组。
      

  6.   

    com自动化控件与JavaScript脚本交互数组方法:
    blog.csdn.net/jkler_doyourself/archive/2008/08/08/2786643.aspx
      

  7.   

    com自动化控件与JavaScript脚本交互数组方法:
    blog.csdn.net/jkler_doyourself/archive/2008/08/08/2786643.aspx