Functions for Setting and Retrieving Values from Variant Safe Arrays


Desktop-as-a-Service Designed for Any Cloud ? Nutanix Frame

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<BSTRArray,BSTR>(&toVariant,someThing,VT_BSTR);
// _BSTR_TArray someThing;
// GetVariant<_BSTR_TArray,BSTR>(fromVariant,someThing);
// _bstr_t _bstr=someThing.GetSize(),GetAt(),[n]
// GetVariant<DATEArray,DATE>(fromVariant,dt);
// GetVariant<OLEDATETIMEArray,DATE>(fromVariant,dt);
// OleDateTime x=dt.GetAt(n) ...GetSize(),[],.....

#include <afxtempl.h>

typedef CArray<BSTR,BSTR> BSTRArray;
typedef CArray<DATE,DATE> DATEArray;
typedef CArray<_bstr_t,_bstr_t> _BSTR_TArray;
typedef CArray<COleDateTime,COleDateTime> OLEDATETIMEArray;
typedef CArray<DWORD,DWORD> DWORDArray;

template <class T,class T1> 
void FillVariant(VARIANT* pVariant, T& arrySrc,int iType)
 int iMax = arrySrc.GetSize();

 SAFEARRAY * pSafeArray; 
 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];
 pVariant->parray = pSafeArray;

template <class T,class T1> 
void GetVariant(VARIANT variant, T& arrySrc)
 long lStartBound = 0;
 long lEndBound = 0;
 SAFEARRAY* pSafeArray  = variant.parray;
 SafeArrayGetLBound(pSafeArray, 1, &lStartBound);
 SafeArrayGetUBound(pSafeArray, 1, &lEndBound);

 T1* arrayAccess = NULL;
 SafeArrayAccessData(pSafeArray, (void**)&arrayAccess);
 for(int iIndex = lStartBound; iIndex <= lEndBound; iIndex ++)


  • There are no comments yet. Be the first to comment!

  • You must have javascript enabled in order to post comments.

Leave a Comment
  • Your email address will not be published. All fields are required.

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date