精华内容
下载资源
问答
  • VARIANT变量转换

    千次阅读 2013-11-05 22:26:23
     我们怎么把一个整形或double型等其它的类型赋值给VARIANT变量呢,或者是VARIANT变量怎么赋值给int等其它类型呢。 2、 VARIANT是一个结构体,它的结构体如下: struct tagVARIANT {  union {  

    1、 在VC++编程中,我们常常会遇到这样的函数,如:::SetValue(const VARIANTpropVal); 我们怎么把一个整形或double型等其它的类型赋值给VARIANT型变量呢,或者是VARIANT型变量怎么赋值给int等其它类型呢。

    2、 VARIANT是一个结构体,它的结构体如下:

    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;

    };

    3、 Float型转化为VARIANT

    //float型转化为VARIANT

    VARIANT va1;

    float a1=m_Fre1_AD9852;

    va1.vt=VT_R4;///指明float数据,VT_I4是整型,VT_R8double

    //va1.lVal=a1; 

    va1.fltVal=a1; //指明fltVal是float型赋值,intVal是整型,dblVal是double

    m_Fre1_wknob.SetValue(va1);

    4、 VARIANT型转化为double型

    VARIANT var;

    var=m_Power_wknob.GetValue();//获取值

    value_power=var.dblVal; ///指明fltVal是float型赋值,intVal是整型,dblVal是double

    AMP_dBm_Reg=value_power;//赋值给double型

    展开全文
  • 如何才能实现VARIANT类型变量转换成Str类型的变量? 例如: ////为VARIANT型不变量cvt赋值; VARIANT cvt; float b; b=10.11; cvt=COleVariant(b); 如何才能将cvt的值转换成Str型变量cstr?
  • VARIANT变量

    千次阅读 2008-07-27 16:54:00
     定义VARIANT变量可以直接定义VARIANT类型变量。 VARIANT val; b. 初始化VARIANT变量在使用VARIANT变量之前,一定要初始化。 VariantInit(&val); c. 设置变量值设置变量值前如果VARIANT变量中已经有值,先...

     1.  直接使用VARIANT变量
    a.   定义VARIANT变量
    可以直接定义VARIANT类型的变量。

     

    VARIANT val;

     

    b.   初始化VARIANT变量
    在使用VARIANT变量之前,一定要初始化。

     

    VariantInit(&val);

     

    c.   设置变量值
    设置变量值前如果VARIANT变量中已经有值,先要清除原有数据。

     

    VariantClear(&val);

    val.vt = VT_I4;   // 设置类型

    val.lVal = 10;    // 设置变量值

     

    d.   清除VARIANT变量
    在使用完VARIANT变量后,要清除变量,否则会发生内存泄漏。

     

    VariantClear(&val);

     

    e.   动态分配VARIANT变量
    如果要动态分配VARIANT变量,应该使用标准的COM内存管理函数。

    标准COM内存管理函数包括CoTaskMemAlloc、CoTaskMemFree和CoTaskMemRealloc。

     

    VARIANT * pVal;

    pVal = (VARIANT *)CoTaskMemAlloc(size_of(VARIANT));

    VariantInit(pVal);

    pVal->vt = VT_I4;

    pVal->lVal = 10;

    ...

    VariantClear(pVal);

    CoTaskMemFree(pVal);

     

    2.  通过CComVariant使用VARIANT变量
    CComVariant是ATL对于VARIANT的简单包装。通过CComVariant可以更简单的使用VARIANT,而不必担心没有进行初始化或清除。如果没有特殊情况,应该尽量使用CComVariant而不要使用VARIANT。

    以下是使用CComVariant的代码实例。

     

    CComVariant Val;

    Val.vt = VT_I4;

    Val.lVal = 10;

    // Val 不必清除

     

    以下是使用CComVariant数组的例子。

     

    CComVariant * pVal;

    pVal = new CComVariant[10];

    for (int i = 0; i < 10; ++i)

    {

        pVal[i].vt = VT_I4;

        pVal[I].lVal = i + 1;

    }

    ...

    delete[] pVal;

    展开全文
  • c++17可用variant,实现多类型变量。比起optional,自由度更高。 如下代码判断一个数字是否大于5,如果大于5,输出bignumber,否则输出enum值 #include <iostream> #include <variant> #include <...

    c++17可用variant,实现多类型变量。比起optional,自由度更高。
    如下代码判断一个数字是否大于5,如果大于5,输出bignumber,否则输出enum值

    #include <iostream>
    #include <variant>
    #include <string>
    
    enum class ErrorCode {
    	BIGNUMBER = 0, SMALLNUMBER=1, ERROR=2
    };
    
    std::variant<std::string, ErrorCode> NumberGame(int number) {
    	std::variant<std::string, ErrorCode> name;
    	if (number > 5) {
    		name = "big number";
    	}
    	else {
    		name = ErrorCode::SMALLNUMBER;
    	}
    	return name;
    
    }
    
    int main() {
    	auto name = NumberGame(4);
    	if (std::get_if<std::string>(&name)) {
    		std::cout << std::get<std::string>(name);
    	}
    	else {
    		auto a =  std::get<ErrorCode>(name);
    		if (a == ErrorCode::SMALLNUMBER) {
    			std::cout << 1;
    		}
    	}
    	
    }
    

    输出:1

    展开全文
  • Variant类型

    2012-02-06 12:58:00
    Variant类型 为了完全支持OLE,32位Delphi 增加了Variant 数据类型,本节将从宏观角度来分析这种数据类型。实际上,Variant类型对Pascal语言有普遍而深入的影响,Delphi 控件库中与OLE 无关的地方也...

    为了完全支持OLE,32位Delphi 增加了Variant 数据类型,本节将从宏观角度来分析这种数据类型。实际上,Variant类型对Pascal语言有普遍而深入的影响,Delphi 控件库中与OLE 无关的地方也使用到这种类型。

    Variant变量没有类型

    一般说来,你可以用Variant 变量存储任何数据类型,对它执行各种操作和类型转换。需要注意的是:这违反了Pascal 语言的一贯原则,有悖于良好的编程习惯。variant 变量的类型检查和计算在运行期间才进行,编译器不会提示代码中的潜在错误,这些错误在进一步测试中才能发现。总之,你可以认为包含variant变量的代码是解释性代码,正如解释性代码一样,许多操作直到执行时才能知道,这对代码运行速度会有很大的影响。

    上面对Variant 类型的使用提出了警告,现在来看看Variant 类型究竟能干什么。基本上说,如果声明了一个variant 变量:

    var
      V: Variant;

    你就可以把各种不同类型的值赋给它:

    V := 10;
    V := 'Hello, World';
    V := 45.55;

    一旦得到一个variant 值,你可以把它拷贝给任何兼容或不兼容的数据类型。如果你把值赋给不兼容的数据类型,Delphi 会力尽所能进行转换,无法转换则颁布一个运行时间错误。实际上,variant变量中不仅包含了数据还包含有类型信息,并允许一系列运行时间操作,这些操作很方便,但运行速度慢且安全性差。

    见例VariTest,它是上面代码的扩展。窗体上有三个编辑框,一对按钮,第一个按钮的OnClick 事件代码如下:

    procedure TForm1.Button1Click(Sender: TObject);
    var
      V: Variant;
    begin
      V := 10;
      Edit1.Text := V;
      V := 'Hello, World';
      Edit2.Text := V;
      V := 45.55;
      Edit3.Text := V;
    end;

    很有趣是不是?你可以把一个值为字符串的variant 变量赋给编辑框Text 属性,还可以把值为整数或浮点数的variant 变量赋给Text属性。正如你在图10.1中所看到的,一切正常。

    (图10.1)按Assign按钮后,例VariTest的输出结果

    图 10.1: 例 VariTest 的 Assign 按钮 Click 事件输出结果

    更糟糕的是:你还可以用variant变量计算数值,从第二个按钮的Click事件代码就可看到这一点:

    procedure TForm1.Button2Click(Sender: TObject);
    var
      V: Variant;
      N: Integer;
    begin
      V := Edit1.Text;
      N := Integer(V) * 2;
      V := N;
      Edit1.Text := V;
    end;

    至少这种代码带有一定危险性,如果第一个编辑框包含了一个数字,那么一切运行正常;如果不是,将会引发异常。这里再重申一遍,如果不到万不得以,不要随便使用Variant 类型,还是应坚持使用传统的Pascal 数据类型和类型检查方法。在Delphi 和 VCL中,variant变量主要是用于 OLE 支持和数据库域的访问。

    Variant类型内部结构

    Delphi中定义了一个 variant 记录类型,TVarData,它与Variant 类型有相同的内存布局。你可以通过TVarData访问variant变量的实际类型。TVarData 结构中包含了Variant类型信息(由Vtype域表示)、一些保留域及当前值。

    VType域的取值包括OLE 自动化中的所有数据类型,这些类型通常叫OLE 类型或variant 类型。以下是variant 类型的完整列表,按字母顺序排列:

    • varArray
    • varBoolean
    • varByRef
    • varCurrency
    • varDate
    • varDispatch
    • varDouble
    • varEmpty
    • varError
    • varInteger
    • varNull
    • varOleStr
    • varSingle
    • varSmallint
    • varString
    • varTypeMask
    • varUnknown
    • varVariant

    你可以在Delphi 帮助系统的variants 主题下找到这些类型的说明。

    还有许多操作variant 变量的函数,你可以用它们进行特定的类型转换,或通过它们获取variant变量的类型信息(例如VarType 函数),当你用variant变量写表达式时,Delphi会自动调用这些类型转换和赋值函数。另外还有操作variant 数组的例程,你可以通过帮助文件的Variant support routines 主题了解相关内容。

    Variant类型运行很慢!

    Variant 类型代码运行很慢,不仅数据类型转换如此,两个值为整数的Variant 变量相加也是如此。它们几乎跟Visual Basic这种解释性代码一样慢!为了比较Variant变量和整型变量的运行速度,请看例VSpeed 。

    程序中设置了一个循环,记录运行时间并在进程条中显示运行状态。下面是基于variant类型的一段代码,基于整型的代码与此相似:

    procedure TForm1.Button1Click(Sender: TObject);
    var
      time1, time2: TDateTime;
      n1, n2: Variant;
    begin
      time1 := Now;
      n1 := 0;
      n2 := 0;
      ProgressBar1.Position := 0;
      while n1 < 5000000 do
      begin
        n2 := n2 + n1;
        Inc (n1);
        if (n1 mod 50000) = 0 then
        begin
          ProgressBar1.Position := n1 div 50000;
          Application.ProcessMessages;
        end;
      end;
      // we must use the result
      Total := n2;
      time2 := Now;
      Label1.Caption := FormatDateTime (
        'n:ss', Time2-Time1) + ' seconds';
    end;

    记时这段代码值得一看,因为你可以把它用到任何类型的性能测试中。正如你所看到的,程序用Now 函数获取当前的时间,用FormatDateTime 函数格式化时间差,输出结果以分("n")和秒("ss")表示。除此之外,你可以用Windows API的GetTickCount 函数,该函数能精确显示操作系统启动后至当前的毫秒数。

    从上例可见两者的速度差异非常之大,以至于不用精确记时也能看到这种差异。图10.2是在本人计算机上运行程序看到的结果。当然运行结果取决于运行程序的计算机,但是两者的数值比不会有太大变化。

    图 10.2: 例Vspeed中整型与Variant类型的计算速度差异

    结束语

    Variant类型与传统Pascal 数据类型差别很大,所以本章以短小篇幅单独阐述了Variant类型的有关内容。尽管Variant类型主要用于OLE 编程,但用来写一些潦潦草草的程序倒也便利,因为不用考虑数据类型,不过正如以上所述,这样做会影响程序执行速度。

    通过前面各章我们已经介绍了绝大部分的语言特征,下一章将讨论程序的总体框架和单元模块。

    posted on 2012-02-06 12:58 江宇旋 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/jiangyuxuan/archive/2012/02/06/2339915.html

    展开全文
  • 在VC中如何使用VARIANT变量

    千次阅读 2009-01-04 15:32:00
    在VC中如何使用VARIANT变量 VIRIANT是ACTIVEX AUTOMATION需要用到的一种变量类型,可以称之为通用数据类型,其实它是一个结构。如果仅仅是调用ACTIVEX对象所提供的METHOD不需知道其中的细节。它仅用于通过IDISPATCH...
  • variant和OleVariant变量类型的区别

    千次阅读 2014-09-04 11:10:57
    摘自论坛: ...1.一般不建议使用Variant和OleVariant,除非数据类型只有在运行期才能确定或获知的。OleVariant常常用来做基于COM的程序:Auutomation和ActiveX控制,Variant基于non-COM的程序。 2.
  • Variant变体类型的可以理解为:还不知道它是什么类型,将来它会自动变成我想要的类型。即“可变体”。
  • 对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型变量赋值,举个例子:VARIANT va;int a=2001;va.vt=VT_I4;///指明整型数据va.lVal=a; ///赋值对于不马上赋值的VARIANT,最好...
  • 实际上,Variant类型对Pascal语言有普遍而深入的影响,Delphi 控件库中与OLE 无关的地方也使用到这种类型。 Variant变量没有类型 一般说来,你可以用Variant 变量存储任何数据类型,对它执行各种操作和类型转换...
  • variant 类型

    2009-09-25 18:09:00
    Variant 音标 Phonetic symbol [] 词性及解释 Part of speech and defination n.... 变异体, 变型, 变种Variant 数据类型是所有没被显式声明(用如 Dim、Private、Public 或 Static等语句)为其他类型变量的数
  • boost::variant, T2>类型变量的适配

    千次阅读 2016-01-23 00:09:39
    本文我们将介绍boost::variant, T2>类型变量的赋值问题,以及类的类型转换运算符重载函数的调用时机。
  • VARIANT类型的用法

    2019-09-29 18:11:14
     对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型变量赋值,举个例子: VARIANT va; int a=2001; va.vt=VT_I4;///指明整型数据 va.lVal=a; ///赋值 ...
  • 什么是变量变量是一个存储数据的VBA代码结构,在代码中,通过变量名获取变量所代表...通用变量,即Variant类型变量,该变量的类型在程序运行过程中,根据赋值的数据自动指定。数组。 数组包含多个变量的集合对象。对...
  • 关于VC从VARIANT类型取数据的小结

    千次阅读 2009-05-14 17:44:00
    这几天,一直为一个以前没见过的类型头痛不已,网上找解决方法又不贴切,着实让我难受了一阵子.今天终于把问题解决,在这里跟大家分.....在这种情况下,我们可以通过取得VARIANT类型变量的vt值,得以确认: 
  • 第十章: Variant类型

    2011-12-15 14:51:00
    实际上,Variant类型对Pascal语言有普遍而深入的影响,Delphi 控件库中与OLE 无关的地方也使用到这种类型。 Variant变量没有类型  一般说来,你可以用Variant 变量存储任何数据类型,对它执行各种操作和类型转换...
  • 【06】variant 变量

    2011-09-28 23:52:00
    【01】variant 变量可以存储任何数据类型。一旦得到一个 variant 值,你可以把它拷贝给任何兼容或不兼容的数据类型。 如果你把值赋给不兼容的数据类型,Delphi 会力尽所能进行转换,无法转换则颁布一个运行时间错误...
  • VARTYPE vt —— 表示这个VARIANT内部存储的变量类型。 然后就是对应的数据成员了。比如vt为VT_I8,那么对应的数据在llVal;比如vt为VT_R4,那么数据在fltVal中。 获取成员 使用V_VT宏,可以获取VARIANT数据的...
  • VS2013 VT_LPSTR和VT_LPWSTR声明还在但是在VARIANT中对应的pszVal和pwszVal没有了? 在VT_LPSTR和VT_LPWSTR上右键转到声明能跳过去,但是VARIANT类型变量敲不出pszVal和pwszVal了
  • VARIANT类型的用法

    千次阅读 2007-05-16 10:59:00
     对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型变量赋值,举个例子: VARIANT va;int a=2001;va.vt=VT_I4;///指明整型数据va.lVal=a; ///赋值 对于不马上赋值的VARIANT,...
  • 最近对想在程序中支持Script,便于通过脚本取得软件中一些参数。 ... 通过接口向导添加一个Item属性,由于属性可能是常见的...但如果我把VARIANT 改为某个确定的类型,如LONG,程序是没有错误的。为啥VARIANT 就不行呢?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 660
精华内容 264
关键字:

variant类型变量