- 最近经常使用VC的VARIANT,封装了一个 VARIANT类与常见数组的转换类,实现其相关功能,提高了开发效率。
- #pragma once
- enum ElementType
- {
- V_LONGLONG=VT_I8, //VT_I8.
- V_ULONGLONG=VT_UI8, //VT_UI8
- V_LONG=VT_I4, //VT_I4.
- V_ULONG=VT_UI4, //VT_UI4
- V_INT=VT_INT, //VT_INT
- V_UINT=VT_UINT //VT_UINT
- V_BYTE=VT_UI1, //VT_UI1.
- V_CHAR=VT_I1, //VT_CHAR
- V_SHORT=VT_I2, //VT_I2.
- V_USHORT=VT_UI2, //VT_UI2
- V_FLOAT=VT_R4, //VT_R4.
- V_DOUBLE=VT_R8, //VT_R8.
- V_DATE=VT_DATE, //VT_DATE
- V_BSTR=VT_BSTR, //VT_BSTR
- V_VARIANT=VT_VARIANT, //VT_VARIANT
- V_DECIMAL=VT_DECIMAL, //VT_DECIMAL
- };
- template<class T>
- class CVariantPack
- {
- private:
- CVariantPack(void){};
- virtual ~CVariantPack(void){};
- public:
- static bool SetTPtrVariant( ElementType type ,const T *pData,int num,VARIANT &vdata)
- {
- try
- {
- if( pData == NULL || num <= 0 )
- {
- return false;
- }
- SAFEARRAYBOUND rgsabound[1];
- rgsabound[0].lLbound = 0;
- rgsabound[0].cElements = (ULONG)num;
- SAFEARRAY *psa = SafeArrayCreate( type,1, rgsabound );
- if( psa )
- {
- for( long i=0; i<(long)num; i++ )
- {
- SafeArrayPutElement( psa, &i, (void *)(pData + i) );
- }
- vdata.vt = VT_ARRAY | type;
- vdata.parray = psa;
- SafeArrayUnaccessData( psa );
- return true;
- }
- else
- {
- return false;
- }
- }
- catch(...)
- {
- return false;
- }
- };
- static int GetTPtrVariant ( ElementType type ,T *pData,const VARIANT vdata)
- {
- try
- {
- if( vdata.vt==VT_NULL || vdata.vt==VT_EMPTY || pData==NULL )
- {
- return -1;
- }
- if( !(vdata.vt & VT_ARRAY) )
- {
- return -2;
- }
- SAFEARRAY *psa = vdata.parray;
- UINT nDims = SafeArrayGetDim( psa );
- if( nDims != 1 )
- {
- return -3;
- }
- //检查数组元素类型
- VARTYPE vt = 0;
- SafeArrayGetVartype( psa, &vt );
- if( vt != type )
- {
- return -4;
- }
- //检查数组上下限和元素个数是否为偶数个
- LONG lUBound =0, lLBound = 0;
- SafeArrayGetUBound( psa, 1, &lUBound );
- SafeArrayGetLBound( psa, 1, &lLBound );
- int lElements = lUBound - lLBound + 1;
- if( lElements <= 0 )
- {
- return -5;
- }
- T *pTmp = NULL;
- SafeArrayAccessData( psa, (void **)&pTmp );
- if( NULL == pTmp )
- {
- return -6;
- }
- memcpy( pData,pTmp,lElements*sizeof(T));
- SafeArrayUnaccessData( psa );
- return lElements;
- }
- catch(...)
- {
- return -1;
- };
- };
- };
//Example
- long a[] ={1,2,3};
- VARIANT vdata;
- //long 数组封装到VARIANT
- if( !CVariantPack<long>::PackTPtrVariant(V_LONG,a,3,vdata))
- {
- return false;
- }
- long b[10]={0} ;
- //从VARIANT获取long数组数据
- int num= CVariantPack<long>::GetTPtrVariant(V_LONG,b,vdata);
- if( num<=0 )
- {
- return false;
- }