VARIANT数组封装类

  1.     最近经常使用VC的VARIANT,封装了一个 VARIANT类与常见数组的转换类,实现其相关功能,提高了开发效率。
  2. #pragma once
  3. enum ElementType
  4. {   
  5.     V_LONGLONG=VT_I8,       //VT_I8.
  6.     V_ULONGLONG=VT_UI8,     //VT_UI8
  7.     V_LONG=VT_I4,           //VT_I4.
  8.     V_ULONG=VT_UI4,         //VT_UI4
  9.     V_INT=VT_INT,           //VT_INT
  10.     V_UINT=VT_UINT          //VT_UINT
  11.     V_BYTE=VT_UI1,          //VT_UI1.
  12.     V_CHAR=VT_I1,           //VT_CHAR
  13.     V_SHORT=VT_I2,          //VT_I2.
  14.     V_USHORT=VT_UI2,        //VT_UI2
  15.     V_FLOAT=VT_R4,          //VT_R4.
  16.     V_DOUBLE=VT_R8,         //VT_R8.
  17.     V_DATE=VT_DATE,         //VT_DATE
  18.     V_BSTR=VT_BSTR,         //VT_BSTR
  19.     V_VARIANT=VT_VARIANT,   //VT_VARIANT
  20.     V_DECIMAL=VT_DECIMAL,   //VT_DECIMAL
  21. };
  22. template<class T>
  23. class CVariantPack
  24. {
  25. private:
  26.     CVariantPack(void){};
  27.     virtual ~CVariantPack(void){};
  28. public:
  29.     static bool SetTPtrVariant( ElementType type ,const T *pData,int num,VARIANT &vdata)
  30.     {
  31.         try
  32.         {   
  33.             if( pData == NULL || num <= 0 )
  34.             {
  35.                 return false;
  36.             }
  37.             SAFEARRAYBOUND rgsabound[1];
  38.             rgsabound[0].lLbound = 0;
  39.             rgsabound[0].cElements = (ULONG)num;
  40.             SAFEARRAY *psa = SafeArrayCreate( type,1, rgsabound );
  41.             if( psa )
  42.             {
  43.                 forlong i=0; i<(long)num; i++ )
  44.                 {
  45.                     SafeArrayPutElement( psa, &i, (void *)(pData + i) );
  46.                 }
  47.                 vdata.vt = VT_ARRAY | type;
  48.                 vdata.parray = psa;
  49.                 SafeArrayUnaccessData( psa );
  50.                 return true;    
  51.             }
  52.             else
  53.             {
  54.                 return false;
  55.             }
  56.         }
  57.         catch(...)
  58.         {
  59.             return false;
  60.         }
  61.     }; 
  62.     static int GetTPtrVariant ( ElementType type ,T *pData,const VARIANT vdata)
  63.     {
  64.         try
  65.         {
  66.             if( vdata.vt==VT_NULL || vdata.vt==VT_EMPTY || pData==NULL )
  67.             {
  68.                 return -1;
  69.             }
  70.             if( !(vdata.vt & VT_ARRAY)  )
  71.             {
  72.                 return -2;
  73.             }
  74.             SAFEARRAY *psa = vdata.parray;
  75.             UINT nDims = SafeArrayGetDim( psa );
  76.             if( nDims != 1 )
  77.             {
  78.                 return -3;
  79.             }
  80.             //检查数组元素类型
  81.             VARTYPE vt = 0;
  82.             SafeArrayGetVartype( psa, &vt );
  83.             if( vt != type )
  84.             {
  85.                 return -4;
  86.             }
  87.             //检查数组上下限和元素个数是否为偶数个
  88.             LONG lUBound =0, lLBound = 0;
  89.             SafeArrayGetUBound( psa, 1, &lUBound );
  90.             SafeArrayGetLBound( psa, 1, &lLBound );
  91.             int lElements = lUBound - lLBound + 1;
  92.             if( lElements <= 0 )
  93.             {
  94.                 return -5;
  95.             }
  96.             T *pTmp = NULL;
  97.             SafeArrayAccessData( psa, (void **)&pTmp );
  98.             if( NULL == pTmp )
  99.             {
  100.                 return -6;
  101.             }
  102.             memcpy( pData,pTmp,lElements*sizeof(T));
  103.             SafeArrayUnaccessData( psa );
  104.             return lElements;   
  105.         }
  106.         catch(...)
  107.         {
  108.             return -1;
  109.         };
  110.     };
  111.     
  112. };

 

                        //Example
  1.     long a[] ={1,2,3};
  2.     VARIANT vdata;
  3.     //long 数组封装到VARIANT
  4.     if( !CVariantPack<long>::PackTPtrVariant(V_LONG,a,3,vdata))
  5.     {
  6.         return false;
  7.     }
  8.     long b[10]={0} ;
  9.     //从VARIANT获取long数组数据
  10.     int num= CVariantPack<long>::GetTPtrVariant(V_LONG,b,vdata); 
  11.     if( num<=0 )
  12.     {
  13.         return false;
  14.     }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值