VARIANT 数据类型在文件OAIDL.IDL中定义如下:

【vc中数据类型,对应类为_variant_t】

struct tagVARIANT {
    union {
        struct __tagVARIANT {
            VARTYPE vt;
            WORD    wReserved1;
            WORD    wReserved2;
            WORD    wReserved3;
            union {
                ULONGLONG     ullVal;       /* VT_UI8               */
                LONGLONG      llVal;        /* VT_I8                */
                LONG          lVal;         /* VT_I4                */
                BYTE          bVal;         /* VT_UI1               */
                SHORT         iVal;         /* VT_I2                */
                FLOAT         fltVal;       /* VT_R4                */
                DOUBLE        dblVal;       /* VT_R8                */
                VARIANT_BOOL  boolVal;      /* VT_BOOL              */
                _VARIANT_BOOL bool;         /* (obsolete)           */
                SCODE         scode;        /* VT_ERROR             */
                CY            cyVal;        /* VT_CY                */
                DATE          date;         /* VT_DATE              */
                BSTR          bstrVal;      /* VT_BSTR              */
                IUnknown *    punkVal;      /* VT_UNKNOWN           */
                IDispatch *   pdispVal;     /* VT_DISPATCH          */
                SAFEARRAY *   parray;       /* VT_ARRAY             */
                BYTE *        pbVal;        /* VT_BYREF|VT_UI1      */
                SHORT *       piVal;        /* VT_BYREF|VT_I2       */
                LONG *        plVal;        /* VT_BYREF|VT_I4       */
                LONGLONG *    pllVal;       /* VT_BYREF|VT_I8       */
                FLOAT *       pfltVal;      /* VT_BYREF|VT_R4       */
                DOUBLE *      pdblVal;      /* VT_BYREF|VT_R8       */
                VARIANT_BOOL *pboolVal;     /* VT_BYREF|VT_BOOL     */
                _VARIANT_BOOL *pbool;       /* (obsolete)           */
                SCODE *       pscode;       /* VT_BYREF|VT_ERROR    */
                CY *          pcyVal;       /* VT_BYREF|VT_CY       */
                DATE *        pdate;        /* VT_BYREF|VT_DATE     */
                BSTR *        pbstrVal;     /* VT_BYREF|VT_BSTR     */
                IUnknown **   ppunkVal;     /* VT_BYREF|VT_UNKNOWN  */
                IDispatch **  ppdispVal;    /* VT_BYREF|VT_DISPATCH */
                SAFEARRAY **  pparray;      /* VT_BYREF|VT_ARRAY    */
                VARIANT *     pvarVal;      /* VT_BYREF|VT_VARIANT  */
                PVOID         byref;        /* Generic ByRef        */
                CHAR          cVal;         /* VT_I1                */
                USHORT        uiVal;        /* VT_UI2               */
                ULONG         ulVal;        /* VT_UI4               */
                INT           intVal;       /* VT_INT               */
                UINT          uintVal;      /* VT_UINT              */
                DECIMAL *     pdecVal;      /* VT_BYREF|VT_DECIMAL  */
                CHAR *        pcVal;        /* VT_BYREF|VT_I1       */
                USHORT *      puiVal;       /* VT_BYREF|VT_UI2      */
                ULONG *       pulVal;       /* VT_BYREF|VT_UI4      */
                ULONGLONG *   pullVal;      /* VT_BYREF|VT_UI8      */
                INT *         pintVal;      /* VT_BYREF|VT_INT      */
                UINT *        puintVal;     /* VT_BYREF|VT_UINT     */
                struct __tagBRECORD {
                    PVOID         pvRecord;
                    IRecordInfo * pRecInfo;
                } __VARIANT_NAME_4;         /* VT_RECORD            */
            } __VARIANT_NAME_3;
        } __VARIANT_NAME_2;

DECIMAL decVal;
    } __VARIANT_NAME_1;
};
VARIANT数据结构包含两个域(如果不考虑保留的域)。vt域描述了第二个域的数据类型。为了使多种类型能够在第二个域中出现,我们定义了一个联合结构。所以,第二个域的名称随着vt域中输入值的不同而改变。用于指定vt域值情况的常量在联合的定义中以每一行的注释形式给出。
使用VARIANT和VARIANTARG数据结构要分两步完全。举一个例子,让我们考虑如下代码:
long lValue = 999;
VARIANT vParam;
vParam.vt = VT_I4;
vParam.lVal = lValue;
在第一行中指定数据类型。常量VT_I4表明在第二个域中将出现一个long型的数据。根据类型VARIANT的定义,可以得知,当一个long型数据存入VARIANT类型时,其第二个域使用的名称是lVal。
使用VARIANT来传递参数意味着非强类型语言(例如VBScript)能够调用使用强类型语言(C++)实现的方法。Invoke()方法的实现可以检查参数VARIANT封装的数值是否符合其正确的数据类型。如果符合,该类型将取出,并传递给调用方法。否则,Invoke()方法能够尝试使用 VariantChangeType()API函数来将该数值转换成正确的类型。

Visual C++常用数据类型转换详解
2007-01-20 17:25

本文将介绍一些常用数据类型的使用。

我们先定义一些常见类型变量借以说明

int i = 100; 
long l = 2001; 
float f=300.2; 
double d=12345.119; 
char username[]="女侠程佩君"; 
char temp[200]; 
char *buf; 
CString str; 
_variant_t v1; 
_bstr_t v2;

一、其它数据类型转换为字符串

短整型(int) 
itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制 
itoa(i,temp,2); ///按二进制方式转换 
长整型(long) 
ltoa(l,temp,10);

二、从其它包含字符串的变量中获取指向该字符串的指针

CString变量 
str = "2008北京奥运"; 
buf = (LPSTR)(LPCTSTR)str; 
BSTR类型的_variant_t变量 
v1 = (_bstr_t)"程序员"; 
buf = _com_util::ConvertBSTRToString((_bstr_t)v1);

三、字符串转换为其它数据类型 
strcpy(temp,"123");

短整型(int) 
i = atoi(temp); 
长整型(long) 
l = atol(temp); 
浮点(double) 
d = atof(temp);

四、其它数据类型转换到CString 
使用CString的成员函数Format来转换,例如:

整数(int) 
str.Format("%d",i); 
浮点数(float) 
str.Format("%f",i); 
字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值 
str = username;

五、BSTR、_bstr_t与CComBSTR

CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。 
char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h 
反之可以使用char *p=_com_util::ConvertBSTRToString(b);

六、VARIANT 、_variant_t 与 COleVariant

VARIANT的结构可以参考头文件VC98/Include/OAIDL.H中关于结构体tagVARIANT的定义。 
对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子: 
VARIANT va; 
int a=2001; 
va.vt=VT_I4;///指明整型数据 
va.lVal=a; ///赋值

对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:

unsigned char bVal; VT_UI1 
short iVal; VT_I2 
long lVal;  VT_I4   
float fltVal;  VT_R4 
double dblVal;  VT_R8   
VARIANT_BOOL boolVal;  VT_BOOL 
SCODE scode;  VT_ERROR 
CY cyVal;  VT_CY 
DATE date;  VT_DATE 
BSTR bstrVal;  VT_BSTR 
IUnknown FAR* punkVal;  VT_UNKNOWN 
IDispatch FAR* pdispVal;  VT_DISPATCH 
SAFEARRAY FAR* parray;  VT_ARRAY|* 
unsigned char FAR* pbVal;  VT_BYREF|VT_UI1 
short FAR* piVal;  VT_BYREF|VT_I2 
long FAR* plVal;  VT_BYREF|VT_I4 
float FAR* pfltVal;  VT_BYREF|VT_R4 
double FAR* pdblVal; VT_BYREF|VT_R8 
VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL 
SCODE FAR* pscode;  VT_BYREF|VT_ERROR 
CY FAR* pcyVal;  VT_BYREF|VT_CY 
DATE FAR* pdate; VT_BYREF|VT_DATE 
BSTR FAR* pbstrVal;  VT_BYREF|VT_BSTR 
IUnknown FAR* FAR* ppunkVal;  VT_BYREF|VT_UNKNOWN 
IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH 
SAFEARRAY FAR* FAR* pparray;  VT_ARRAY|* 
VARIANT FAR* pvarVal;  VT_BYREF|VT_VARIANT 
void FAR* byref;  VT_BYREF

_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。 
例如: 
long l=222; 
ing i=100; 
_variant_t lVal(l); 
lVal = (long)i;

COleVariant的使用与_variant_t的方法基本一样,请参考如下例子: 
COleVariant v3 = "字符串", v4 = (long)1999; 
CString str =(BSTR)v3.pbstrVal; 
long i = v4.lVal;

七、其它

对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如: 
LPARAM lParam; 
WORD loValue = LOWORD(lParam);///取低16位 
WORD hiValue = HIWORD(lParam);///取高16位 
对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如: 
WORD wValue; 
BYTE loValue = LOBYTE(wValue);///取低8位 
BYTE hiValue = HIBYTE(wValue);///取高8位

VARIANT 数据类型相关推荐

  1. Variant 数据类型介绍

    Variant 数据类型是所有没被显式声明(用如 Dim.Private.Public 或 Static等语句)为其他类型变量的数据类型.Variant 数据类型并没有类型声明字符. Variant ...

  2. VARIANT 数据类型简单介绍

    VIRIANT是ACTIVEX AUTOMATION需要用到的一种变量类型,可以称之为通用数据类型,其实它是一个结构.如果仅仅是调用ACTIVEX对象所提供的METHOD不需知道其中的细节.它仅用于通 ...

  3. VARIANT数据类型详解

    VARIANT 数据类型在文件OAIDL.IDL中定义如下: struct tagVARIANT {      union {          struct __tagVARIANT {       ...

  4. C++ VARIANT数据类型操作详解

    使用VARIANT来传递参数意味着非强类型语言(例如VBScript)能够调用使用强类型语言(C++)实现的方法. VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构 ...

  5. Variant数据类型

    Variant 数据类型是所有没被显式声明(用如 Dim.Private.Public 或 Static等语句)为其他类型变量的数据类型.Variant 数据类型并没有类型声明字符. Variant ...

  6. jdbc执行sql 不支持“variant”数据类型。

    把查询出来的列转换下类型 select cast(a as varchar(500)) from b cast( as varchar(500)) 转载于:https://www.cnblogs.co ...

  7. variant php,Variant 是什么数据类型?

    Variant 是什么数据类型? Variant是一种特殊的数据类型,该类型是没有类型声明字符,作用是能够在运行期间动态的改变类型,并且支持所有简单的数据类型,如整型.浮点.字符串.布尔型.日期时间. ...

  8. VC----各种数据类型VARIANT、COleVariant 、_variant_t

    VARIANT.COleVariant 和_variant_t 在OLE.ActiveX和COM中,VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可 ...

  9. C++变体数据类型—— VARIANT

    百度百科: Variant 音标 Phonetic symbol [] 词性及解释 Part of speech and defination n. 变体, 异体 a. 不同的, 有差别的 [计] 变 ...

最新文章

  1. 双圆弧插值算法(二)
  2. 配置多路由的静态路由
  3. php 跳转网页 变量,php变量与JS变量实现不通过跳转直接交互的方法
  4. 深度学习——RNN原理与TensorFlow2下的IMDB简单实践
  5. nginx+tomcat8+memcached实现session共享具体操作
  6. IOS 开发 UIProgress 和 UISlidre 进度条和滑动条组件
  7. 台风路径超级计算机,厄尔尼诺又要来了?2号台风或要生成,超级计算机:路径争议大...
  8. 不打游戏还整个i7 8700的弊端,完全用不上
  9. 【报告分享】中国电信5G行业场景案例集.pdf(附下载链接)
  10. RedHat Linux下Samba配置(简单配置)-转
  11. win7如何设置通电自动开机_WIN7旗舰版在BIOS界面下如何设置自动开机?
  12. 【转载】微信公众平台发展趋势猜想
  13. 新手提问!求解答QAQADODB.Recordset 错误 #x27;800a0bb9#x27; 参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。
  14. 计算机数字顺序怎么带公式,Excel函数公式:6个数据排序技巧,总有一个适合你!...
  15. 饼图指北(Pie Chart)
  16. ROS学习笔记之小乌龟跟随
  17. visual assist x太卡了_带你纵横职场的高阶EVO笔记本 华硕灵耀X纵横评测
  18. 第一个模板类(templetclass elemType class xxxxx)
  19. 国内十大活跃报表 BI 产品深度点评
  20. ### Cause: java.sql.SQLSyntaxErrorException: Column ‘update_time‘ specified twice

热门文章

  1. R语言 批量导入数据
  2. manchi翻译中文 mi_女生发Mimanchi是什么意思,mi manchi翻译中文是我想你
  3. Mybatis Generator配置文件完整配置详解
  4. DNS服务器上门维修电话,全国DNS服务器地址列举
  5. 2021宁夏高考的会考成绩查询,【宁夏成人高考成绩查询时间_2021年成人高考成绩查询】- 环球网校...
  6. cellspacing和cellpadding的区别
  7. ios 图片像素点取颜色,判断颜色是否为亮色,颜色对比
  8. 软件测试需要学习什么 一文告诉你,软测内容需要学这些
  9. P3628 [APIO2010]特别行动队(斜率优化DP)
  10. sublime text 3 - win10输入法输入框不跟随问题解决