#21 如何让我的控件输出数组?
参阅如下代码:void CMyControl::GetArray( VARIANT FAR* pVariant )
{
    //商业代码
   int nCount = GetCount();
   //定义维数
   SAFEARRAYBOUND saBound[1];
   //定义数组指针对性
   SAFEARRAY* pSA;   saBound[0].cElements = nCount;
   saBound[0].lLbound = 0;
   //创建数组
   pSA = SafeArrayCreate( VT_BSTR, 1, saBound );   for( long i = 0; i < nCount; i++ )
   {
      BSTR bstr;      //商业代码
      bstr = GetItem( i ).AllocSysString();
//给数组赋值
      SafeArrayPutElement( pSA, &i, bstr );
      ::SysFreeString( bstr );
   }   // 初始化传递的参数
   VariantInit( pVariant );   //设置返值的类型为数组
   pVariant->vt = VT_ARRAY | VT_BSTR;
   pVariant->parray = pSA;
}
Visual Basic 代码:    Dim t As Variant
    Dim i as Integer    MyControl1.GetArray t    For i = 0 To MyControl1.Count - 1
        ListBox.AddItem  t( i )
    Next i

解决方案 »

  1.   

    vcmfc(菜虫)我参照了,我昨天就在CSDN搜遍了你的文章,可你的是for BSTR的,我参照了许久也不得要领。
    例如从ASP中传进来的数值数组是8bit还是16bit还是32bit?
    vt=VT_ARRAY &brvbar; VT_UI1;还是VT_I2还是VT_I4?
    能否请您再详细说说。
      

  2.   

    这个你可以参照MSDN中VARIANT结构的说明,MSDN写的太清楚了。
      

  3.   

    看错了标题!ASP应该是32位,是int型!
      

  4.   

    好像还是不行,不是VT_T2也不是VT_I4
    STDMETHODIMP CAspTTT::Poly(VARIANT varPoint)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()) // TODO: Add your implementation code here
    SAFEARRAY *psa;
    DWORD  nChunkSize;
    long  cDim;
    long * pNum;
    DWORD  nElemSize;
    VARIANT  *pvarData;
       CFile m_File;

    CString cs,cs1;
    if(m_File.Open("D:\\log.txt",CFile::modeCreate|CFile::modeWrite))
    {
    cs=cs+"开始...";


    cs1.Format("VarPoint.vt=%x...",varPoint.vt); 
    cs=cs+cs1; if(varPoint.vt == (VT_VARIANT | VT_BYREF))
    {
    cs=cs+"Variant|ByRef...";
    pvarData = varPoint.pvarVal;
    }
    else
    {
    cs=cs+"not variant|Byref";
    pvarData = &varPoint;
    }

        
      cs1.Format("pVarData->vt=%x...",pvarData->vt);
    cs=cs+cs1;
    cs1.Format("the VTARRAY_VT_I4=%x...\n", VT_ARRAY|VT_I4 );
    cs=cs+cs1; cs1.Format("the VTARRAY_VT_I2=%x...", VT_ARRAY|VT_I2) ;
    cs=cs+cs1;

    cs1.Format("VT_I4 | VT_BYREF=%X...",VT_I4 | VT_BYREF);
    cs=cs+cs1;
    if(pvarData->vt == (VT_ARRAY|VT_R4))
    {
    cs=cs+"VT_R4";
    } if(pvarData->vt == (VT_ARRAY|VT_I4))
    {
    cs=cs+"VT_I4";
    } if(pvarData->vt == (VT_ARRAY|VT_I2))
    {

    cs=cs+"VT_I2";
    }
    psa = pvarData->parray;
    cDim = ::SafeArrayGetDim(psa);
        cs1.Format("cDim1=%d...",cDim);
    cs=cs+cs1;
    cs1.Format("cEle=%d...", psa->rgsabound[0].cElements);
    cs=cs+cs1;
    if(pvarData->vt == (VT_ARRAY|VT_INT))
    {

    //m_File.Write("VT_INT",6) ;
    SafeArrayAccessData(psa, (void**)&pNum);
    ai.m_lFontSize=*pNum;
    pNum++;
    ai.m_bFontBold =*pNum; 
    SafeArrayUnaccessData(psa);/*
    //if(cDim == 1) 
    {
    pNum=
    nElemSize = ::SafeArrayGetElemsize(psa);
    nChunkSize = psa->rgsabound[0].cElements * nElemSize;
    ::SafeArrayLock(psa);
    long * l_Num=NULL;
    l_Num=(long *)psa->pvData;
    ai.m_lFontSize=*l_Num;
                l_Num++;
    ai.m_bFontBold =*l_Num; 
    ::SafeArrayUnlock(psa);
    }
    */
    }  
    m_File.Write(cs,cs.GetLength()); 
    m_File.Write("结束...",8);
    m_File.Close();  }

    return S_OK;
    }
    log.txt内容
    开始...VarPoint.vt=400c...Variant|ByRef...pVarData->vt=600c...the VTARRAY_VT_I4=2003...
    the VTARRAY_VT_I2=2002...VT_I4 | VT_BYREF=4003...cDim1=1280...cEle=4558580...结束...