HOW TO PUT STRING LIKE "SafeArrayPutElement"
SafeArrays
http://www.geocities.ws/jeff_louie/safearray.html
Code:
// ASSERT newVal > 0
STDMETHODIMP CArray::GetArray(int newVal, VARIANT *pVal)
{
    // TODO: Add your implementation code here
    USES_CONVERSION;
    char buffer[20];
    HRESULT hr= S_OK;
    if (newVal < 1) {
        newVal= 1;
    }

    // Create SafeArray of VARIANT BSTRs
    SAFEARRAY *pSA;
    SAFEARRAYBOUND aDim[2];    // two dimensional array
    aDim[0].lLbound= 0;
    aDim[0].cElements= newVal;
    aDim[1].lLbound= 0;
    aDim[1].cElements= newVal;    // rectangular array
    pSA= SafeArrayCreate(VT_VARIANT,2,aDim);  // again, 2 dimensions
    long aLong[2];
    long lSum;
    if (pSA != NULL) {
        _variant_t vOut;
        for (long x= aDim[0].lLbound; x< (aDim[0].cElements + aDim[0].lLbound); x++) { 
            aLong[0]= x;    // set x index
            for (long y= aDim[1].lLbound; y< (aDim[1].cElements + aDim[1].lLbound); y++) {
                aLong[1]= y;    // set y index
                lSum= x+y;
                ltoa(lSum,buffer,10);
                vOut= A2W(buffer);
                if (hr= SafeArrayPutElement(pSA, aLong, &vOut)) {
                    SafeArrayDestroy(pSA); // does a deep destroy
                    return hr;
                }
            }
        }
    }    

    // return SafeArray as VARIANT
    //VariantInit(pVal); // WARNING You must initialize *pVal before calling Detach
    V_VT(pVal)= VT_ARRAY | VT_VARIANT; //pVal->vt= VT_ARRAY | VT_VARIANT; 
    V_ARRAY(pVal)= pSA; // (pSA may be null) //pVal->parray= pSA; // UNION oleauto.h
    return S_OK;
}