我知道SafeArray。我之所以这样写是因为看到了书上的例子。而且,既然存在size_is这样的idl关键字,为什么还要我用SafeArray呢?SafeArray里面有bound信息,那么size_is岂不是多次一举呢?
非常困惑中,请解惑!

解决方案 »

  1.   


    COM 中的数组是以SafeArray 类型来表示
    下面是对数组的操作
    bool CXXX::GetSafeArray(_variant_t& var, vector<string>& vecArray)
    {
    if( false == (var.vt & VT_ARRAY) )
    {
    return false;
    } ULONG len = var.parray->rgsabound[0].cElements;
    VARIANT * pv =(_variant_t*)var.parray->pvData; for( int i = 0; i < len; i++ )
    {
    vecArray.push_back(string(_com_util::ConvertBSTRToString(pv[i].bstrVal)));
    } return true;
    }bool CIISAdmin::SetSafeArray(IADs *pSite, string strArrayName, vector<string> vecArray)
    { if( !pSite || strArrayName.length() == 0)
    {
    return false;
    } SAFEARRAY* pSA;
    SAFEARRAYBOUND aDim[1];
    aDim[0].lLbound = 0;
    aDim[0].cElements = vecArray.size(); pSA = SafeArrayCreate(VT_VARIANT,1,aDim); for(long l = 0; l < vecArray.size(); l++) 
    {
    VARIANT vtTmp = _variant_t(vecArray[l].c_str());
    if(S_OK != SafeArrayPutElement(pSA,&l,&vtTmp)) 
    {
    break;
    }
    }
    _variant_t vt;
    VariantInit(&vt);
    BSTR pArrayName = _com_util::ConvertStringToBSTR(strArrayName.c_str()); _variant_t var;
    pSite->Get(pArrayName,&var);
    V_VT(&vt) = var.vt;//vt.vt | VT_ARRAY;
    V_ARRAY(&vt) = pSA;
    HRESULT hRet = pSite->Put(pArrayName, vt);
    SysFreeString(pArrayName); pSite->SetInfo();
    //SafeArrayDestroy(pSA);
    //SafeArrayUnaccessData(pSA);
    VariantClear(&vt); return true;
    }