MFC之COleVariant类

MFC之COleVariant类COleVariant本质上是一个枚举,用同一种类型来表达不同的子类型。如同boost中的variant。 COleVariant类是对VARIANT结构的封装。  VARIANT结构包含两部分。其一是VARTYPE型的成员变量vt;其二是个联合类型,这个联合包含了VC常用的几乎所有类型。因为联合用的是相同的存储空间,因此对联合的内容的解释依赖于vt。  例如,  若vt的…

大家好,又见面了,我是你们的朋友全栈君。

 

COleVariant 本质上是一个枚举,用同一种类型来表达不同的子类型。如同boost中的variant

 COleVariant类是对VARIANT结构的封装。
  VARIANT 结构包含两部分。其一是 VARTYPE 型的成员变量vt;其二是个联合类型,这个联合包含了VC常用的几乎所有类型。因为联合用的是相同的存储空间,因此对联合的内容的解释依赖于 vt。
  例如,
  若 vt 的值是 VT_UI2, 说明该联合被解释为short int. 并使用成员变量名 iVal。
  若 vt 的的值是 VT_BSTR,说明该联合被解释为 BSTR 类型。并使用成员变量名 bstrVal。
  若 vt 的的值是 VT_BSTR|VT_BYREF,说明该联合被解释为BSTR 型指针。并使用成员变量名 pbstrVal。
  它的构造函数具有极为强大的功能,当对象构造时首先调用VariantInit进行 初始化,然后根据参数中的标准类型调用相应的构造函数,并使用VariantCopy进行转换赋值操作,当VARIANT对象不在有效范围时,它的析构函 数就会被自动调用,由于析构函数调用了VariantClear,因而相应的内存就会被自动清除。除此之外,COleVariant的赋值操作符在与 VARIANT类型转换中为我们提供极大的方便。

 

若从数据库返回的是简单类型,如 short, long, 等,则直接引用既可。(主持人注:COleVariant类重载了“=”操作符,所以常用类型可以直接转换)若返回的是字符串类型,则有可能是 bstrVal 或pbstrVal。依赖于数据库服务程序。 BSTR 实际上就是个unicode 字符串,CString 的构造函数和赋值操作都能直接识别这一类型。
    
    AndySun问:
    VARIANT结构的vt成员可以为值VT_DECIMAL,当然,这个值在MSDN的帮助中似乎没有,但在VARIANT定义的源文件中确实有它的定义,它是在wtypes.h文件中定义的。但我不明白怎样将VT_DECIMAL的数据转换成常用的C数据类型,更想知道 VT_DECIMAL中究竟存放的是一个怎样的数据,应怎样将这个数据显示出来。谢谢!
    李海答:你可以使用COleVariant的ChangeType函数(相当于API函数VariantChangeType)将VT_DECIMAL转换为其他常用类型。

 

 例子

1 [cpp] view plaincopyprint?
2 01.COleVariant var(3.6f);  
3 02.float v = var.fltVal;  
4 03.CString str("testCOleVariant");  
5 04.COleVariant var2(str);  
6 05.CString cpStr(var2.bstrVal);  

  例子

01.CString CMFCPropertyGridProperty::m_strFormatChar = _T("%c");  
02.CString CMFCPropertyGridProperty::m_strFormatShort = _T("%d");  
03.CString CMFCPropertyGridProperty::m_strFormatLong = _T("%ld");  
04.CString CMFCPropertyGridProperty::m_strFormatUShort = _T("%u");  
05.CString CMFCPropertyGridProperty::m_strFormatULong = _T("%u");  
06.CString CMFCPropertyGridProperty::m_strFormatFloat = _T("%f");  
07.CString CMFCPropertyGridProperty::m_strFormatDouble = _T("%lf");  
08.  
09.CString CMFCPropertyGridProperty::FormatProperty()  
10.{  
11.    ASSERT_VALID(this);  
12.    ASSERT_VALID(m_pWndList);  
13.  
14.    COleVariant& var = m_varValue;  
15.  
16.    CString strVal;  
17.  
18.    .............  
19.  
20.    switch (var.vt)  
21.    {  
22.    case VT_BSTR:  
23.        strVal = var.bstrVal;  
24.        break;  
25.  
26.    case VT_I2:  
27.        strVal.Format(m_strFormatShort, (short)var.iVal);  
28.        break;  
29.  
30.    case VT_I4:  
31.    case VT_INT:  
32.        strVal.Format(m_strFormatLong, (long)var.lVal);  
33.        break;  
34.  
35.    case VT_UI1:  
36.        if ((BYTE)var.bVal != 0)  
37.        {  
38.            strVal.Format(m_strFormatChar, (TCHAR)(BYTE)var.bVal);  
39.        }  
40.        break;  
41.  
42.    case VT_UI2:  
43.        strVal.Format( m_strFormatUShort, var.uiVal);  
44.        break;  
45.  
46.    case VT_UINT:  
47.    case VT_UI4:  
48.        strVal.Format(m_strFormatULong, var.ulVal);  
49.        break;  
50.  
51.    case VT_R4:  
52.        strVal.Format(m_strFormatFloat, (float)var.fltVal);  
53.        break;  
54.  
55.    case VT_R8:  
56.        strVal.Format(m_strFormatDouble, (double)var.dblVal);  
57.        break;  
58.  
59.    case VT_BOOL:  
60.        strVal = var.boolVal == VARIANT_TRUE ? m_pWndList->m_strTrue : m_pWndList->m_strFalse;  
61.        break;  
62.  
63.    default:  
64.        // Unsupported type   
65.        strVal = _T("*** error ***");  
66.    }  
67.  
68.    return strVal;  
69.}  

 

COleVariant框架内容

 

01.class COleVariant : public tagVARIANT  
02.{  
03.    COleVariant(LPCTSTR lpszSrc);  
04.    COleVariant(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set to ANSI string   
05.    COleVariant(CString& strSrc);  
06.  
07.    COleVariant(BYTE nSrc);  
08.    COleVariant(short nSrc, VARTYPE vtSrc = VT_I2);  
09.    COleVariant(long lSrc, VARTYPE vtSrc = VT_I4);  
10.    COleVariant(const COleCurrency& curSrc);  
11.  
12.    COleVariant(float fltSrc);  
13.    COleVariant(double dblSrc);  
14.    COleVariant(const COleDateTime& timeSrc);  
15.....................................  
16.    const COleVariant& operator=(float fltSrc);  
17.    const COleVariant& operator=(double dblSrc);  
18.    const COleVariant& operator=(const COleDateTime& dateSrc);  
19.  
20.    const COleVariant& operator=(const CByteArray& arrSrc);  
21.    const COleVariant& operator=(const CLongBinary& lbSrc);  
22.};  
23.  
24.    void Clear();  
25.    void ChangeType(VARTYPE vartype, LPVARIANT pSrc = NULL);  
26.    void Attach(VARIANT& varSrc);  
27.    VARIANT Detach();  
28.   void GetByteArrayFromVariantArray(CByteArray& bytes);  
29.void SetString(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set ANSI string   
30.    operator LPVARIANT();  
31.    operator LPCVARIANT() const  
32./   
33.struct tagVARIANT  
34.    {    union   
35.        {  
36.        struct __tagVARIANT  
37.            {  
38.    VARTYPE vt;  
39.    .......................  
40.            union   
41.                {  
42.                LONGLONG llVal;  
43.                LONG lVal;  
44.                BYTE bVal;  
45.                SHORT iVal;  
46.                FLOAT fltVal;  
47.                DOUBLE dblVal;  
48.                ...........  
49.                DATE date;  
50.                BSTR bstrVal;  
51.                IUnknown *punkVal;  
52.     IDispatch *pdispVal;  
53.    ..............  
54.    }  
55.      
56.COleVariant::COleVariant(float fltSrc)  
57.        { vt = VT_R4; fltVal = fltSrc; }  
58._AFXDISP_INLINE COleVariant::COleVariant(CString& strSrc)  
59.        { vt = VT_EMPTY; *this = strSrc; }  
60.      
61.const COleVariant& COleVariant::operator=(const CString& strSrc)  
62.{  
63.    // Free up previous VARIANT   
64.    Clear();  
65.  
66.    vt = VT_BSTR;  
67.    bstrVal = strSrc.AllocSysString();  
68.  
69.    return *this;  
70.    }  
71.      
72.typedef unsigned short VARTYPE;  
73.    
75. * VARENUM usage key,  
76. *  
77. * * [V] - may appear in a VARIANT  
78. * * [T] - may appear in a TYPEDESC  
79. * * [P] - may appear in an OLE property set  
80. * * [S] - may appear in a Safe Array  
81. *  
82. *  
83. *  VT_EMPTY            [V]   [P]     nothing  
84. *  VT_NULL             [V]   [P]     SQL style Null  
85. *  VT_I2               [V][T][P][S]  2 byte signed int  
86. *  VT_I4               [V][T][P][S]  4 byte signed int  
87. *  VT_R4               [V][T][P][S]  4 byte real  
88. *  VT_R8               [V][T][P][S]  8 byte real  
89. *  VT_CY               [V][T][P][S]  currency  
90. *  VT_DATE             [V][T][P][S]  date  
91. *  VT_BSTR             [V][T][P][S]  OLE Automation string  
92. *  VT_DISPATCH         [V][T]   [S]  IDispatch *  
93. *  VT_ERROR            [V][T][P][S]  SCODE  
94. *  VT_BOOL             [V][T][P][S]  True=-1, False=0  
95. *  VT_VARIANT          [V][T][P][S]  VARIANT *  
96. *  VT_UNKNOWN          [V][T]   [S]  IUnknown *  
97. *  VT_DECIMAL          [V][T]   [S]  16 byte fixed point  
98. .......................................  
99.  
100.enum VARENUM  
101.    {   VT_EMPTY    = 0,  
102.    VT_NULL = 1,  
103.    VT_I2   = 2,  
104.    VT_I4   = 3,  
105.    VT_R4   = 4,  
106.    VT_R8   = 5,  
107.    VT_CY   = 6,  
108.    VT_DATE = 7,  
109.    VT_BSTR = 8,  
110.    .........................................  
111.        } ;  

 

COleVariant功能:
  COleVariant类是对VARIANT结构的封装。它的构造函数具有极为强大的功能:
  1、当对象构造时首先调用VariantInit进行 初始化,然后根据参数中的标准类型调用相应的构造函数,并使用VariantCopy进行转换赋值操作;
  2、当VARIANT对象不在有效范围时,它的析构函 数就会被自动调用,由于析构函数调用了VariantClear,因而相应的内存就会被自动清除。
  COleVariant是数据库常用到的数据类型。它可以是字串,整型值,日期等。知道怎样将它转换为CString很有用处。
  例如:设有CString A; COleVariant B; 来看看怎样将COleVariant转换为CString:
  switch(B.vt){

  case VT_BSTR: A=V_BSTRT(&B); break;//COleVariant是一个字串
  case VT_I2: A.Format(_T(“%hd”),V_I2(&B));break;//是短整型
  case VT_I4: A.Format(_T(“%d”),V_I4(&B));break;//是长整型
  case VT_R4: A.Format(_T(“%e”),(double)V_R4(&B));break;//是浮点数
  case VT_R8: A.Format(_T(“%e”),V_R8(&B));break;//是浮点数
  case VT_CY: A=COleCurrency(B).Format();break;//是货币值
  case VT_DATE: A=COleDateTime(B).Format(“%Y-%m-%d”);break;//是日期
  case VT_BOOL: A=V_BOOL(&B)?”True”:”False”;break;//是布尔值}

转载于:https://www.cnblogs.com/yangxx-1990/p/4885236.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161041.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 互联网时代下用户的安全需求_这是一个互联网的时代

    互联网时代下用户的安全需求_这是一个互联网的时代突然意识到这个课题自己也挺感兴趣,而且形势很严峻。

    2022年10月5日
    2
  • WPF使用DialogResult.OK报错

    WPF使用DialogResult.OK报错直接用“System.Nullable<bool>”不包含“OK”的定义,并且找不到可接受类型为“System.Nullable<bool>”的第一个参数的扩展方法“OK”(是否缺少using指令或程序集引用?)F:\练习\WpfMapView\WpfMapView\MainWindow.xaml.cs115if(…

    2022年6月22日
    46
  • 单片机_MFRC522射频模块使用方法(含代码)

    单片机_MFRC522射频模块使用方法(含代码)MFRC522射频模块使用方法本文只讲解MFRC522射频模块使用方法(下文简称522模块),不包含原理说明,原理下篇~一、管脚解释522模块总共有8个引脚,除去复位、GND接地、3.3V电源、NC端悬空、SCK时钟端,剩余3个引脚,起数据作用。二、连接方法这里主要使用IIC的方法,相信写过IIC的同学都很熟悉这段代码。不熟悉也没关系,后文会附上52单片机的LCD1602显示UID的实现代码,包含UART测试代码。显而易见,通过总线办法读取数据只需要依照手册写代码就可以读出来,这里官方提供了

    2022年7月26日
    45
  • java 容器类_java容器排序

    java 容器类_java容器排序Java的容器在Java中,我们想要保存对象可以使用很多种手段。最简单的就是数组。但是数组具有固定的尺寸,而通常来说,程序总是在运行时根据条件来创建对象,我们无法预知将要创建对象的个数以及类型,所以Java推出了容器类来解决这一问题。Java容器的基本概念Java容器类库是用来保存对象的,他有两种不同的概念:Collection,独立元素的序列,这些元素都服从一条或多条规则。Lis…

    2025年11月3日
    5
  • mysql8分区表_MySQL 分区表[通俗易懂]

    mysql8分区表_MySQL 分区表[通俗易懂]MySQL分区就是将一个表分解为多个更小的表。从逻辑上讲,只有一个表或一个索引,但在物理上这个表或者索引可能由多个物理分区组成。每个分区在物理上都是独立的。MySQL数据库分区类型:Range分区:行数据基于属于一个给定连续区间的列值放入分区。List分区:和Range分区类似,只是List分区面向的是离散的值。Hash分区:根据用户自定义的表达式的返回值来进行分区,返回值不能为负数。Key分区:…

    2022年6月11日
    44
  • JavaScript 对象Array,Map,Set使用

    for(int i = 0 ;i 在说明每个对象的用法之前,首先说明 JavaScript 对象的使用一定要注意浏览器的兼容性问题!尤其是IE的版本!!!! }想查看具体的API请查询 JavaScript 对象 这里面有具体的API介绍!Array,Map,Set使用细则参考上面的JavaScript 对象!下面主要说一下Map!MapJavaScript 的Map

    2022年2月26日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号