前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MFC之COleVariant类

MFC之COleVariant类

作者头像
全栈程序员站长
发布2022-09-09 12:01:46
4400
发布2022-09-09 12:01:46
举报
文章被收录于专栏:全栈程序员必看

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

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转换为其他常用类型。

例子

代码语言:javascript
复制
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);  

例子

代码语言:javascript
复制
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框架内容

代码语言:javascript
复制
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.cn/161041.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • COleVariant 本质上是一个枚举,用同一种类型来表达不同的子类型。如同boost中的variant。
  • 例子
  • 例子
  • COleVariant框架内容
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档