//头文件
1 #pragma once
class VariantConvert
{
public:
VariantConvert(void);
~VariantConvert(void); public:
void short2Variant(short sData,VARIANT &va);
//VARIANT short2Var(shortsData);
void long2Variant(long lData,VARIANT& va);
void float2Variant(float fData, VARIANT& va);
void double2Variant(double dData,VARIANT &va);
void unChar2Variant(unsigned char chData,VARIANT &va);
void arrayDouble2Variant(double *pArray,int iDim1Num,int iDim2Num,VARIANT &vaArray);
void arrayDouble2Variant(double *pArray,int iDimlength,VARIANT &vaArray);
void arraylong2Variant(long *pArray,int iDim1Num,int iDim2Num,VARIANT& vaArray);
void arraylong2Variant(long *pArray,int iDimlength,VARIANT &vaArray);
//void arrayunChar2Variant(byte *pArray,int iDim1Num,int iDim2Num,VARIANT &vaArray );
void arrayunChar2Variant(byte *pArray,int iDimlength,VARIANT &vaArray);
public:
//void Variant2Data(VARIANT vaData, void&Data);
bool Variant2short(VARIANT vaData, short &sData);
bool Variant2long(VARIANT vaData, long & lData);
bool Variant2float(VARIANT vaData,float& fData);
bool Variant2double(VARIANT vaData,double & dData);
void Variant2Array(VARIANT vaArray,UINT &iDim,long&iDim1Num,long &iDim2Num,LPVOID *pData);
void Variant2Array(VARIANT vaArray,UINT &nDim,long&lDimLenght,VOID** pData);
};

实现文件

#include "StdAfx.h"
#include "VariantConvert.h" VariantConvert::VariantConvert(void)
{
} VariantConvert::~VariantConvert(void)
{
}
void VariantConvert::short2Variant(short sData,VARIANT& va)
{
va.vt=VT_I2;
va.iVal = sData;
} void VariantConvert:: long2Variant(long lData,VARIANT& va)
{
va.vt = VT_I4;
va.lVal = lData;
} void VariantConvert::float2Variant(float fData,VARIANT& va)
{
va.vt = VT_R4;
va.fltVal = fData;
} void VariantConvert::double2Variant(double dData,VARIANT& va)
{
va.vt = VT_R8;
va.dblVal = dData;
} void VariantConvert::unChar2Variant(unsigned char chData,VARIANT& va)
{
va.vt = VT_UI1;
va.bVal = chData;
} void VariantConvert::arrayDouble2Variant(double *pArray,int iDim,int iDim1Num,int iDim2Num,VARIANT&vaArray)
{ SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[2];// 二维需要定义两个元素
rgsabound[0].lLbound =0; // 一维的下界(下界就是下标的最小值)
rgsabound[0].cElements=iDim1Num; // 一维的元素的个数
rgsabound[1].lLbound =0; // 二维的下界
rgsabound[1].cElements =iDim2Num; // 二维的元素的个数
long lIndex[2]; // 定义索引
psa = SafeArrayCreate(VT_R8,2, rgsabound); // 按照二维数组分配空间
for ( long k = 0; k< iDim1Num; k++)
{
lIndex[0] =k;
for (long num = 0; num < iDim2Num;num++)
{
lIndex[1] =num;
SafeArrayPutElement (psa, lIndex,&pArray[k*iDim2Num+num]); //lIndex作为SAFEARRAY中的索引。
}
} vaArray.vt =VT_ARRAY|VT_R8; // 类型
vaArray.parray =psa; // 赋值 } // One dimension Convert
void VariantConvert::arrayDouble2Variant(double *pArray,int iDimlength,VARIANT &vaArray)
{
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound=0;
rgsabound[0].cElements=iDimlength;
psa = SafeArrayCreate(VT_R8,1,rgsabound);
long lIndex[1];
for (int k=0; k < iDimlength; k++)
{
lIndex[0]=k;
SafeArrayPutElement(psa,lIndex,&pArray[k]);
}
vaArray.vt = VT_ARRAY|VT_R8;
vaArray.parray= psa;
} void VariantConvert::arraylong2Variant(long *pArray,int iDim1Num,int iDim2Num,VARIANT& vaArray)
{
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[2]; // 二维需要定义两个元素
rgsabound[0].lLbound =0; // 一维的下界
rgsabound[0].cElements=iDim1Num; // 一维的元素的个数
rgsabound[1].lLbound =0; // 二维的下界
rgsabound[1].cElements =iDim2Num; // 二维的元素的个数
long lIndex[2]; // 定义索引
psa = SafeArrayCreate(VT_I4, 2, rgsabound); // 按照二维数组分配空间
for ( long k = 0; k < iDim1Num; k++){
lIndex[0] =k;
for (long num = 0; num < iDim2Num;num++ )
{
lIndex[1] =num;
SafeArrayPutElement (psa, lIndex,&pArray[k*iDim2Num+num]); //lIndex作为SAFEARRAY中的索引。
}
}
vaArray.vt = VT_ARRAY|VT_I4;
vaArray.parray = psa;
} void VariantConvert::arraylong2Variant(long *pArray,int iDimlength,VARIANT &vaArray)
{
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound=0;
rgsabound[0].cElements=iDimlength;
psa = SafeArrayCreate(VT_I4,1,rgsabound);
long lIndex[1];
for (int k=0; k < iDimlength; k++)
{
lIndex[0]=k;
SafeArrayPutElement(psa,lIndex,&pArray[k]);
}
vaArray.vt = VT_ARRAY|VT_I4;
vaArray.parray= psa;
}
//
//
//
void VariantConvert::arrayunChar2Variant(byte *pArray,int iDim1Num,int iDim2Num,VARIANT& vaArray)
{
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[2]; // 二维需要定义两个元素
rgsabound[0].lLbound =0; // 一维的下界
rgsabound[0].cElements=iDim1Num; // 一维的元素的个数
rgsabound[1].lLbound =0; // 二维的下界
rgsabound[1].cElements =iDim2Num; // 二维的元素的个数
long lIndex[2]; // 定义索引
psa = SafeArrayCreate(VT_UI1, 2, rgsabound); // 按照二维数组分配空间
for ( long k = 0; k < iDim1Num; k++)
{
lIndex[0] =k;
for (long num = 0; num < iDim2Num;num++)
{
lIndex[1] =num;
SafeArrayPutElement (psa, lIndex,&pArray[k*iDim2Num+num]); //lIndex作为SAFEARRAY中的索引。
}
}
vaArray.vt =VT_ARRAY|VT_UI1; //vaArray为安全数组类型,每个元素为unsigned char 类型
vaArray.parray =psa;
}
//
//
//
void VariantConvert::arrayunChar2Variant(byte *pArray,int iDimlength,VARIANT &vaArray)
{
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound=0;
rgsabound[0].cElements=iDimlength;
psa = SafeArrayCreate(VT_UI1,1,rgsabound);
long lIndex[1];
for (int k=0; k < iDimlength; k++)
{
lIndex[0]=k;
SafeArrayPutElement(psa,lIndex,&pArray[k]);
}
vaArray.vt = VT_ARRAY|VT_UI1;
vaArray.parray= psa;
}
////////////////////////////////////////////////////////////////////////////
//
//
//
// void VariantConvert::Variant2Data(VARIANT vaData, void& Data)
// {
// switch(vaData.vt)
// {
// case VT_I2:
// Data =vaData.iVal;
// break;
// case VT_I4:
// Data =vaData.lVal;
// break;
// case VT_R4:
// Data =vaData.fltVal;
// break;
// case VT_R8:
// Data =vaData.dblVal;
// break;
// case VT_UI1:
// Data =vaData.bVal;
// break;
//
// }
//}
//
//
//
bool VariantConvert::Variant2short(VARIANT vaData, short& sData)
{
if (vaData.vt == VT_I2)
{
sData = vaData.iVal;
return true;
}
else
{
return false;
}
}
//
//
//
bool VariantConvert::Variant2long(VARIANT vaData, long& lData)
{
if (vaData.vt == VT_I4)
{
lData = vaData.iVal;
return true;
}
else
{
return false;
}
}
//
//
//
bool VariantConvert::Variant2float(VARIANT vaData,float& fData)
{
if (vaData.vt == VT_R4)
{
fData = vaData.iVal;
return true;
}
else
{
return false;
}
}
//
//
//
bool VariantConvert::Variant2double(VARIANT vaData,double& dData)
{
if (vaData.vt == VT_R4)
{
dData = vaData.iVal;
return true;
}
else
{
return false;
}
}
//
//
//
void VariantConvert::Variant2Array(VARIANT vaArray,UINT& iDim,long& iDim1Num,long& iDim2Num, LPVOID *pData)
{
// //获得维数
//UINT iDim =SafeArrayGetDim(vaStartMark.parray);
iDim = SafeArrayGetDim(vaArray.parray);
if (iDim != 2)
{
return;
}
// //获得元素大小,这个没什么用
UINT uEleSize = SafeArrayGetElemsize(vaArray.parray ); // 获得一维的下界和上界
long nDim1UBound;
long nDim1LBound;
SafeArrayGetUBound( vaArray.parray, 1, &nDim1UBound);
SafeArrayGetLBound( vaArray.parray, 1, &nDim1LBound);
// //获得二维的下界和上界
long nDim2UBound;
long nDim2LBound;
SafeArrayGetUBound( vaArray.parray, 2, &nDim2UBound);
SafeArrayGetLBound( vaArray.parray, 2, &nDim2LBound);
//
// //计算元素个数,分配空间使用
//long nDim1Count = nDim1UBound - nDim1LBound +1;
//long nDim2Count = nDim2UBound - nDim2LBound + 1;
iDim1Num = nDim1UBound - nDim1LBound + 1;
iDim2Num = nDim2UBound - nDim2LBound +1; int x = 0;
int y = 0;
long lIndex[2];
for ( long nDim1 = nDim1LBound; nDim1 < nDim1UBound; nDim1++)
{
lIndex[0] =nDim1;
y =0;
for ( long nDim2 =nDim2LBound; nDim2 < nDim2UBound; nDim2++)
{
lIndex[1] =nDim2;
SafeArrayGetElement (vaArray.parray, lIndex,pData[x*nDim2UBound+y]);
y++;
}
x++;
} }
//
//
//
void VariantConvert::Variant2Array(VARIANT vaArray,long& lDimLenght,VOID** pData)
{
// //获得维数
//UINT iDim =SafeArrayGetDim(vaStartMark.parray); if (nDim != 1)
{
return;
}
// //获得元素大小,这个没什么用
UINT uEleSize = SafeArrayGetElemsize(vaArray.parray );
// 获得一维的下界和上界
long nDim1UBound;
long nDim1LBound;
SafeArrayGetUBound( vaArray.parray, 1, &nDim1UBound);
SafeArrayGetLBound( vaArray.parray, 1, &nDim1LBound);
// //计算元素个数,分配空间使用
//long nDim1Count = nDim1UBound - nDim1LBound +1;
//long nDim2Count = nDim2UBound - nDim2LBound + 1;
lDimLenght = nDim1UBound - nDim1LBound +1;
// 转换
int x = 0;
int y = 0;
long lIndex[1];
for ( long nDim1 = nDim1LBound; nDim1 < nDim1UBound; nDim1++)
{
SafeArrayGetElement (vaArray.parray, lIndex,&pData[x]);
}
x++;
}

  

常用数据与VARIANT之间的转换---从网上整理的更多相关文章

  1. C# 实现Oracle中的数据与Excel之间的转换

    最近项目要求实现数据库之间数据在各个数据库之间导入导出,在此做个笔记 1. 将Oracle中的表导入到Excel中,反之亦然  private static readonly string conne ...

  2. 37.Activity之间的转换以及数据的传递(Intent)学习

      Intent简介:                                                                                在一个Androi ...

  3. C#字符串和数据之间的转换

    c#中不仅仅存在数值类型的数据之间的转换,字符串和数值之间也是可以互相转换的,只是方法不同而已. 1 数值型转换为字符型 数值型数据转换为字符串用ToString()方法即可实现 int num1=1 ...

  4. java基础类型数据与String类包装类之间的转换与理解

    数据类型转换一般分为三种: 在java中整型,实型,字符型视为简单数据类型,这些数据类型由低到高分别为:(byte,short,char--int-long-float-double) 简单数据类型之 ...

  5. JavaBean和json数据之间的转换(一)简单的JavaBean转换

    1.为什么要使用json? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,因为其高性能.可读性强的原因,成为了现阶段web开发中前后端交互数据的主要数据 ...

  6. java json数据转List对象的集合-----阿里巴巴插件---及原生json---JSON 与 对象 、集合 之间的转换 JSON字符串和java对象的互转【json-lib】

    List<RunfastFullLess> list=(List<RunfastFullLess>)JSONArray.parseObject(activity.getFull ...

  7. JavaBean和json数据之间的转换(二)含有date类型的JavaBean

    1.前言 上次讲了简单的JavaBean和json格式之间的转换,代码很简单,但是实际过程中,往往用到的JavaBean都是比较复杂的,其他的字段还好,如果JavaBean中包含了date类型的字段, ...

  8. CString-int-string-char-BSTR之间的转换

    一.CString, int, string, char*之间的转换 string 转 CString CString.Format("%s", string.c_str());c ...

  9. Java基础——基本类型和包装类、基本类型和字符串之间的转换

    基本类型和包装类之间的转换 基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之间的转换就更 ...

随机推荐

  1. 不同的jar里边相同的包名类名怎么区别导入

    今天在做项目的时候遇到了一个很有意思的问题,折磨了我很长时间,不过最终还是解决了,特留此文纪念一下. 遇到的问题: 同样一段代码,在同事那就好使,在我这就找不到一个方法.引用的包也都是相同的,这种问题 ...

  2. [原]ubuntu下制作ubuntu源

    ubuntu下可以用debmirror来下载ubuntu的所有源: 配置ubuntu12.04_mirror.sh ########################################## ...

  3. CodeForces 540D--Bad Luck Island(概率DP)

    貌似竟然是我的第一道概率DP.. 手机码代码真不舒服.... /************************************************ Memory: 67248 KB Ti ...

  4. Jetty 8长连接上的又一个坑

    Jetty 8 长连接的超时断开连接的机制:超时连接机制针对IO传输过程中的数据阻塞时间超过一定阈值时,断开该连接.阻塞指当前处于数据传输阶段,但是连续指定时间内都没有发出或者接收到任何数据时,Jet ...

  5. 教程-Delphi调用C# WEBSERVICE(二)

    第二步:将webserivce的WSDL导入到该dll工程中,如何导,方法至少有两种,我说简单的一种:  file->new->other->WebService->WSDL ...

  6. Laravle Introduction

    Where To Start Learning a new framework can be daunting, but it's also exciting. To smooth your tran ...

  7. Redis_基本类型介绍和指令___1

    1.Key(键) 主要的方法: ->set key(设置) ->get key(得到) ->del key(删除) ->exitst key(存在) -> expires ...

  8. iOS 状态栏、导航栏、工具栏、选项卡大小

    1.状态栏状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注意,两倍高度的状态栏在好像只能在纵向的模式下使用.如下图用户可以隐藏状态栏,也可以将状态栏设置为灰色,黑色或者半透明的黑 ...

  9. 六款值得推荐的android(安卓)开源框架简介【转】

    http://my.oschina.net/u/1244156/blog/380647 1.volley 项目地址 https://github.com/smanikandan14/Volley-de ...

  10. 标准I/O库之定位流

    有三种方法定位标准I/O流. (1)ftell和fseek函数.这两个函数自V7以来就存在了,但是它们都假定文件的位置可以存放在一个长整型中. (2)ftello和fseeko函数.Single UN ...