转:MFC之COleVariant

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

例子

[cpp]  view plain  copy
  1. COleVariant var(3.6f);  
  2. float v = var.fltVal;  
  3. CString str("testCOleVariant");  
  4. COleVariant var2(str);  
  5. CString cpStr(var2.bstrVal);  

 

例子

[cpp]  view plain  copy
  1. CString CMFCPropertyGridProperty::m_strFormatChar = _T("%c");  
  2. CString CMFCPropertyGridProperty::m_strFormatShort = _T("%d");  
  3. CString CMFCPropertyGridProperty::m_strFormatLong = _T("%ld");  
  4. CString CMFCPropertyGridProperty::m_strFormatUShort = _T("%u");  
  5. CString CMFCPropertyGridProperty::m_strFormatULong = _T("%u");  
  6. CString CMFCPropertyGridProperty::m_strFormatFloat = _T("%f");  
  7. CString CMFCPropertyGridProperty::m_strFormatDouble = _T("%lf");  
  8.   
  9. 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框架内容

[cpp]  view plain  copy
    1. class COleVariant : public tagVARIANT  
    2. {  
    3.     COleVariant(LPCTSTR lpszSrc);  
    4.     COleVariant(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set to ANSI string  
    5.     COleVariant(CString& strSrc);  
    6.   
    7.     COleVariant(BYTE nSrc);  
    8.     COleVariant(short nSrc, VARTYPE vtSrc = VT_I2);  
    9.     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.   
    74. /*  
    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.         } ;  

转载于:https://www.cnblogs.com/yfz0/p/5862089.html

新学期领福利!购实物周边送年卡会员! T恤、键盘、双肩包等周边任选!还能解锁资源下载、VIP文章等多重会员权益! 阅读详情

相关推荐

MFC初探》之变量类型

From:https://blog.csdn.net/a1459268562/article/details/70653695 MFC常用数据类型:https://www.cnblogs.com/xzxl/p/7955477.html 刚接触 MFC 的人一看到里面各种各样的关键字肯定傻眼了,仿佛完全是另外一门语言了,因为 MFC 中把 C++ 中的...

墨鱼菜鸡 1313

COleVariant和CByteArray

VC中常用的动态数组 如果是字节就用CByteArray 如果是字就可以用CWordArray

【用MFC写串口调试助手】

利用MFC创建的串口调试助手

陆先森不怕鬼的博客 5465

MFCCOleVariant

COleVariant 本质上是一个枚举,用同一种类型来表达不同的子类型。如同boost中的variant。 例子 COleVariant var(3.6f); float v = var.fltVal; CString str("testCOleVariant"); COleVariant var2(str); CString cpStr(var2.bstrVal); 例子 CStrin

dreamcs的专栏 2万+

C++字符串完全指南 - MFC

C++字符串完全指南(2) - MFC类 作者: 连波 类别: VC/VC.NET 日期: 2003-1-6 14:29:21 C++字符串完全指南(2) - MFCMFC类CStringMFC的CString含有TCHAR,它的实际字符类型取决于预处理标记的设置。通常,CString象STL字符串一样是不透明对象,只能用CString的

evers的专栏 2596

MFCCOleVariant

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

weixin_30598225的博客 668

【温故而知新】C和C++篇外篇:COleVariant类型

今天在做一个windows平台的小工具顺便熟悉一下windows开发的一些基础知识,在这个过程中,发现了

Workshop of Wenjie.Yin 4925

COleVariant 类型和其他类型之间的换方法

我在使用属性窗口时用到的,总结如下 它可以是字串,整型值,日期等                 CString   A;   COleVariant   B;                  switch(B.vt){                         case   VT_BSTR:     A=V_BSTRT(&B);   break;//COleVariant

猪头的博客 1944

BSTR、LPSTR、LPWSTR、CString、VARIANT、COleVariant 、_variant_t、CComBSTR、_bstr_t .

BSTR、LPSTR、LPWSTR、CString、VARIANT、COleVariant 、_variant_t、CComBSTR、_bstr_t 各个类型的互相

robinyin666的博客 388

字符串换系列三:VARIANT、COleVariant 和_variant_t

  三、VARIANT、COleVariant 和_variant_t  在OLE、ActiveX和COM中,VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。下面让我们来看看OAIDL.H文件中VARIANT定义的一个简化版:struct tagVARIANT { VARTYPE vt; union {  sho

timewolf的专栏 1万+

BSTR、LPSTR、LPWSTR、CString、VARIANT、COleVariant 、_variant_t、CComBSTR、_bstr_t

 Visual C++.NET涉及到ATL/ATL Server、MFC和托管C++等多种编程方式,不仅功能强大而且应用广泛。在编程中,我们常常会遇到ANSI、Unicode以及BSTR不同编码类 型的字符串换操作。本文先介绍基本字符串类型,然后说明相关的类,如CComBSTR、_bstr_t、CStringT等,最后讨论它们的换方法, 其中还包括使用最新ATL7.0的换类和宏,如CA

学海无涯 378

帖:VARIANT、COleVariant 和_variant_t

VARIANT、COleVariant 和_variant_t

C君传 959

】VS2008环境使用MFC导入Excel文件中的数据

自】http://blog.csdn.net/icyfox_bupt/article/details/6318979 1. 建立MFC工程,MDI(基于对话框),其他默认即可。 2. 操作Excel文件初始化:  project->add class->MFC class from typelib (项目->添加类->Typelib中的MFC类)导入Excel.exe,一般都

qin102qin的专栏 587

VARIANT、COleVariant 和_variant_t

至以下链接,帖是为了自己找着方便。http://blog.csdn.net/Ackarlix/archive/2008/12/29/3640562.aspx  在OLE、ActiveX和COM中,VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。下面让我们来看看OAIDL.H文件中VARIANT定义

aslucky的专栏 532
上一篇: djongo web 框架 路由(urls)、模板(templates)、Ajax、models
下一篇: JavaScript(4)——闭包与this对象以及window对象
weixin_30437847
博客等级 码龄11年 101粉丝 1369原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值