Functions for Setting and Retrieving Values from Variant Safe Arrays 

Here are two very easy-to-use functions for setting (FillVariant) and retrieving (GetVariant) values from a variant safe array. All of the instructions that you'll need to use these functions can be found in the comments below. Simply copy and paste the code from this article into your files and follow these instructions. 

//////////////////////////////////////////////////////////////////////////

// Kishore:-

// include this pice of code in .h file.

// function for putting values to VARIANT->SAFEARRAY

// function for getting values from VARIANT->SAFEARRAY

// 

// @1 Type of Array 

// @2 Actual type contained in the variant

// @3 Variant to read or write 

// @4 Actual array to read or write

// @5 VT_BSTR or VT_DATE ...  (FillVariant)

// Usage:- 

// BSTRArray someThing; someThing.Add(bstr);

// FillVariant(&toVariant,someThing,VT_BSTR);

//

// _BSTR_TArray someThing;

// GetVariant<_BSTR_TArray,BSTR>(fromVariant,someThing);

// _bstr_t _bstr=someThing.GetSize(),GetAt(),[n]

//

// GetVariant(fromVariant,dt);

// GetVariant(fromVariant,dt);

// OleDateTime x=dt.GetAt(n) ...GetSize(),[],.....

////////////////////////////////////////////////////////////////////////////

#include 

typedef CArray BSTRArray;

typedef CArray DATEArray;

typedef CArray<_bstr_t,_bstr_t> _BSTR_TArray;

typedef CArray OLEDATETIMEArray;

typedef CArray DWORDArray;

template  

void FillVariant(VARIANT* pVariant, T& arrySrc,int iType)

{

 ASSERT(NULL!=pVariant);

 VariantInit(pVariant);

 int iMax = arrySrc.GetSize();

 SAFEARRAY * pSafeArray; 

 SAFEARRAYBOUND aDim[1]; 

 aDim[0].lLbound = 0; 

 aDim[0].cElements = iMax;

 pVariant->vt = VT_ARRAY | iType;

 pSafeArray = SafeArrayCreate(iType, 1, aDim);

 T1* dwArray = NULL;

 SafeArrayAccessData(pSafeArray, (void**)&dwArray);

 for(int nCount = 0; nCount < iMax ; nCount++)

 {

  dwArray[nCount] = (T1)arrySrc[nCount];

 }

 SafeArrayUnaccessData(pSafeArray);

 pVariant->parray = pSafeArray;

template  

void GetVariant(VARIANT variant, T& arrySrc)

{

 long lStartBound = 0;

 long lEndBound = 0;

 

 SAFEARRAY* pSafeArray  = variant.parray;

 ASSERT(NULL!=pSafeArray);

 SafeArrayGetLBound(pSafeArray, 1, &lStartBound);

 SafeArrayGetUBound(pSafeArray, 1, &lEndBound);

 T1* arrayAccess = NULL;

 SafeArrayAccessData(pSafeArray, (void**)&arrayAccess);

 

 for(int iIndex = lStartBound; iIndex <= lEndBound; iIndex ++)

 {

  arrySrc.Add((T1)arrayAccess[iIndex]);

 }

 SafeArrayDestroy(pSafeArray);

 SafeArrayUnaccessData(pSafeArray);

}