VARIANT 使用案例

// testLink.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <oaidl.h>

int _tmain(int argc, _TCHAR* argv[])
{
    double array[2]={1.0,2.0};
    double array1[2]={0.0,0.0};
    VARIANT vt;
 vt.vt = VT_ARRAY|VT_R8;

 SAFEARRAYBOUND rgsabound[1];
 rgsabound[0].lLbound = 0;
 rgsabound[0].cElements = 2;

 SAFEARRAY *psa = SafeArrayCreate( VT_R8,1, rgsabound );

    //打包数据方法一
    char *pData = NULL;
 SafeArrayAccessData( psa, (void **)&pData );
    memcpy(pData, (char *)&array[0],8);
 memcpy(pData+8, (char *)&array[1],8);
 SafeArrayUnaccessData(psa);

 /*打包数据方法二
    for(long i=0;i<2;i++)
 {
        SafeArrayPutElement(psa,&i,&array[i]);
 }
 */
   
 vt.parray = psa;

 //取元素
 for(long j=0;j<2;j++)
 {
  SafeArrayGetElement(psa,&j,&array1[j]);
 }
 return 0;
}

 


取VARIANT中元素内容使用到的一些函数, (VARIANT &vArg )
 
    //类型检查
 if( ( VT_NULL == vArg.vt ) || ( VT_EMPTY == vArg.vt ) )
 {
  return -1;
 }
 else if(  0 == ( vArg.vt & VT_ARRAY ) )
 {
  //错误的变体类型
  return -1;
 }

 //检查数组是否一维
 SAFEARRAY *psa = vArg.parray;

 UINT nDims = SafeArrayGetDim( psa );
 if( nDims != 1 )
 {
  //不是一维数组
  return -1;
 }

 //检查数组元素类型
 VARTYPE vt = 0;

 SafeArrayGetVartype( psa, &vt );
 if( vt != VT_UI1 )
 {
  //错误的元素数据类型
  return -1;
 }

 //检查数组上下限和元素个数
 LONG lUBound =0, lLBound = 0;

 SafeArrayGetUBound( psa, 1, &lUBound );
 SafeArrayGetLBound( psa, 1, &lLBound );

 long lElements = lUBound - lLBound + 1;

 if( 0 == lElements )
 {
  return -1;
 }
 else if( lElements < 0 /*|| lElements > 255*/ )
 {
  //数组元素个数错误
  return GPS_ERR_PARAMETER;
 }

 //取数据内容地址
 BYTE *pData = NULL;
 SafeArrayAccessData( psa, (void **)&pData );

 if( NULL == pData )
 {
  return -1;
 }

 。。。。。。


 SafeArrayUnaccessData( psa );

 return 0;

 

你可能感兴趣的:(VARIANT 使用案例)