在使用一个ocx控件时需要传递一个Variant类型的字符串数组,但不知道如何创建请高手指点一二,这里不胜感谢了.小弟在一个类的成员函数中写了以下语句来创建数组。SAFEARRAYBOUND rgsabound;
SAFEARRAY FAR* psa;

rgsabound.lLbound = 0;
rgsabound.cElements = 6;

psa = SafeArrayCreate(VT_BSTR,Dim,&rgsabound);if (psa != NULL)
{
m_var.parray = psa;           //m_var是类中的一个成员变量
}问题如下:
(1)如果创建成功后,需不需要手动修改m_var.vt   项为VT_ARRAY | VT_BSTR
(2)当类实例析构后 m_var.para 所指向的数组需要释放吗?
(3)以上创建了一个包含6个元素的数组,如何给数组各项赋值
(4)有没有简单的方法创建数组(_Variant_T、COleVariant、COldSafeArray行不行)

解决方案 »

  1.   

    1 需要
    2.用SafeArrayDestroy释放
    3.SafeArrayPutElement
    4.照规矩办
      

  2.   

    能不能举个SafeArrayPutElement的例子,放一个字符串到数组中。
      

  3.   

    HRESULT PASCAL __export CPoly::EnumPoints(IEnumVARIANT ** ppenum)
    {
       unsigned int i;
       HRESULT hresult;
       VARIANT var;
       SAFEARRAY * psa;
       CEnumPoint * penum;
       POINTLINK * ppointlink;
       SAFEARRAYBOUND rgsabound[1];
       rgsabound[0].lLbound = 0;
       rgsabound[0].cElements = m_cPoints;   // Creating a SafeArray with 1 element.
       psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
       if(psa == NULL){
          hresult = ResultFromScode(E_OUTOFMEMORY);
          goto LError0;
       }
       // Insert code to create item to be
       // inserted into the safe array.      V_VT(&var) = VT_DISPATCH;
          hresult = ppointlink->ppoint->QueryInterface(
             IID_IDispatch, (void **)&V_DISPATCH(&var));
          if(hresult != NOERROR)
             goto LError1;      ix[0] = i;
          SafeArrayPutElement(psa, ix, &var);
          VariantClear(&var);       ppointlink = ppointlink->next;
       }   hresult = CEnumPoint::Create(psa, &penum);
       if(hresult != NOERROR)
          goto LError1;
       *ppenum = penum;
       return NOERROR;LError1:;
       SafeArrayDestroy(psa);LError0:;
       return hresult;
    }
    Requirements
      

  4.   

    VARIANT vFlavors[3];
    for (i = 0; i < 3; i++)
    {
    VariantInit(&vFlavors[i]);
    V_VT(&vFlavors[i]) = VT_BSTR;
    } V_BSTR(&vFlavors[0]) = SysAllocString(OLESTR("Vanilla"));
    V_BSTR(&vFlavors[1]) = SysAllocString(OLESTR("Chocolate"));
    V_BSTR(&vFlavors[2]) = SysAllocString(OLESTR("Espresso Chip")); long lZero = 0;
    long lOne = 1;
    long lTwo = 2; // Put Elements to the SafeArray:
    hr = SafeArrayPutElement(psa, &lZero,&vFlavors[0]);
    hr = SafeArrayPutElement(psa, &lOne,&vFlavors[1]);
    hr = SafeArrayPutElement(psa, &lTwo,&vFlavors[2]);