2020.3.27C++学习笔记——VARIANT变体数据类型实例

本文介绍了C++中的VARIANT变体数据类型,解释了其在不同语言间安全传输数据的重要性,并详细阐述了VARIANT的定义、结构以及使用方法,包括如何通过设置vt域确定数据类型和赋值。
摘要由CSDN通过智能技术生成

C++学习笔记——VARIANT变体数据类型实例

之前工作中看到了VARIANT数据类型,了解到在较复杂些的工程中,很少只用到一个语言,例如之前的html网页调用ActiveX控件,就至少使用了html,js,c++三种语言。而在工程测试过程中,难免会有不同语言编译的模块要进行数据的传输,此时对于数据类型的定义和声明十分重要。
例如,在html的OCX控件编写中,我发现VS自行生成的ActiveX控件添加方法中,方法的返回值和参数类型都是在固定的列表中进行选择,如BSTR,BTYE,ULONG等,都是ActiveX控件类经过自定义类型后的数据类型,但是有时想要传入void *等参数时,一时间就不知道该如何选择了。

VARIANT的意义:

经过在网上查询资料,感觉VARIANT的存在意义就是帮助不同类型的语言在不违反其自身规则的情况下可以进行安全的数据传送而不涉及到数据类型所可能引发的错误。(待定)
如C++是一种强类型语言,即C++中的某个变量,在使用时类型已经确定,C++中的变量都会被翻译成准确的内存地址和大小,如果类型不确定是不可能处理的。当使用C++这样强类型的语言来读取数据库或者与其他语言之间来交换数据时,它很有可能不知道获取到的数据的具体类型,这个时候必须借助于变体类型读取数据。VARIANT数据类型就具有跨语言的特性,同时它可以表示(存储)任意类型的数据。

VARIANT的定义:

VARIANT的源码定义一般在Microsoft SDKs文件夹中的OAI.h文件中,定义内容很长,不便了解,但是其简化的结构定义如下:

struct tagVARIANT
{
   
    union 
    {
   
        VARTYPE vt;
        WORD wReserved1;
        WORD wReserved2;
        WORD wReserved3;
        union 
        {
   
            LONG lVal;
            BYTE bVal;
            SHORT iVal;
            FLOAT fltVal;
            DOUBLE dblVal;
            VARIANT_BOOL boolVal;
            DATE date;
            BSTR bstrVal;
            SAFEARRAY *parray;
            VARIANT *pvarVal;
        };
    };
}; 

从这个定义中可看到VARIANT数据结构包含两个域(如果不考虑保留的域)。vt域描述了第二个域的数据类型。为了使多种类型能够在第二个域中出现,我们定义了一个联合结构。所以,第二个域的名称随着vt域中输入值的不同而改变。用于指定vt域值情况的常量在联合的定义中以每一行的注释形式给出。
在使用VARIANT时,首先确定vt域的数据类型,再确定第二个域的数据内容。在定义VARIANT时,对应的vt域的值数据内容的标识名都是VARIANT结构中事先自定义声明好的,以下是各数据类型对应的自定义类型名称:

VT域值:

 VARIANT STRUCTURE
 *
 *  VARTYPE vt;
 *  WORD wReserved1;
 *  WORD wReserved2;
 *  WORD wReserved3;
 *  union {
   
 *    LONGLONG       VT_I8
 *    LONG           VT_I4
 *    BYTE           VT_UI1
 *    SHORT          VT_I2
 *    FLOAT          VT_R4
 *    DOUBLE         VT_R8
 *    VARIANT_BOOL   VT_BOOL
 *    SCODE          VT_ERROR
 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值