
Originally Posted by
The trick
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;
}