转: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. CString CMFCPropertyGridProperty::FormatProperty()
  9. {
  10. ASSERT_VALID(this);
  11. ASSERT_VALID(m_pWndList);
  12. COleVariant& var = m_varValue;
  13. CString strVal;
  14. .............
  15. switch (var.vt)
  16. {
  17. case VT_BSTR:
  18. strVal = var.bstrVal;
  19. break;
  20. case VT_I2:
  21. strVal.Format(m_strFormatShort, (short)var.iVal);
  22. break;
  23. case VT_I4:
  24. case VT_INT:
  25. strVal.Format(m_strFormatLong, (long)var.lVal);
  26. break;
  27. case VT_UI1:
  28. if ((BYTE)var.bVal != 0)
  29. {
  30. strVal.Format(m_strFormatChar, (TCHAR)(BYTE)var.bVal);
  31. }
  32. break;
  33. case VT_UI2:
  34. strVal.Format( m_strFormatUShort, var.uiVal);
  35. break;
  36. case VT_UINT:
  37. case VT_UI4:
  38. strVal.Format(m_strFormatULong, var.ulVal);
  39. break;
  40. case VT_R4:
  41. strVal.Format(m_strFormatFloat, (float)var.fltVal);
  42. break;
  43. case VT_R8:
  44. strVal.Format(m_strFormatDouble, (double)var.dblVal);
  45. break;
  46. case VT_BOOL:
  47. strVal = var.boolVal == VARIANT_TRUE ? m_pWndList->m_strTrue : m_pWndList->m_strFalse;
  48. break;
  49. default:
  50. // Unsupported type
  51. strVal = _T("*** error ***");
  52. }
  53. return strVal;
  54. }

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

转:MFC之COleVariant的相关文章

(转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信

此文章以visual C++数据採集与串口通信測控应用实战为參考教程 此文章适合VC++串口通信入门 一.页面布局及加入控件 1, 安装好vs2010如图 2, 新建一个基于VC++的MFC项目comm 注意:点击ok,然后next,这时候要将application type改成dialog base.接着next到最后一个对话框是将generated dasses改成CcommDlg,然后finish 4, 将新生成的项目的对话框默认dialog edit删去,如图 5,在对话框中加入两个st

MFC vs2012 Office2013 读写excel文件

近期在忙一个小项目(和同学一起搞的),在这里客户要求不但读写txt,而且可以读写excel文件,这里本以为很简单,结果...废话少说,过程如下: 笔者环境:win7 64+VS2012+Office2013+MFC. 说明:读写excel文件,通常包括1.ODBC数据库实现;2.通过解析Excel表格文件;3.通过OLE/COM的几种实现方法.本文主要研究通过OLE/COM实现对Excel表格的操作. 步骤: 1.新建MFC对话框.注意勾选自动化,否则后面加入不了需要的库,导致启动服务失败等错误

MFC 与Excel文件的交互操作

假日快要结束了,带着沉重的心情写下之前关于MFC与Excel文件交互的总结.由于VS的版本不同可能在操作上有些差异,所以在此指明下本篇文章的工程环境为VS2013,也建议大家用最新的. 说到程序对于Excel的操作,应该不能算是什么新需求了,方法也有好几种,诸如利用office提供的接口.开源代码之类的.本文在查了一些资料之后选择了实现起来较为反便的一种.其实现的方法基本上完全照抄的这篇文章的,如果看本篇不大明白的可以去看看. 参考的文章说,"踏破铁鞋无觅处,得来费死了工夫",然而进过

VS2010 MFC对Excel的操作

这是帮别人做项目遇到的一个问题,的那个是纠结了老长时间,本以为是一件很轻松的事... 首先,这里采用了OLE来对Excel进行操作,网上其实有大把的例子,虽然都可以运行,但是并不能满足项目要求,其实我要实现的无非就是增查删改功能. 与网上操作步骤一样,首先就是去OFFICE里面将几个重要的类添加进去.网上有一篇文章其实封装的不错了,只是没有删除与新建功能,这里添加了以上几个功能.下面进入正题. a. project->add class->MFC class from typelib (项目-

使用MFC操作EXCEL文件

一.加载 1. 在VC6.0里创建一个MFC工程 2.打开MFCClassWizard窗口(查看->建立类向导),选择Automation,单击AddClass按钮,选择Froma type library...,弹出文件选择对话框,之后定位到C:\Program Files\MicrosoftOffice\OFFICE11\EXCEL.EXE,在生成类中添加所有的对象(其实添加需要的即可,为了简便,不出错保留了冗余),如下图.     3.返回编辑器,查看工程文件,可发现多了EXCEL.9H及

MFC 简单输出EXCEL - (OLE)

三图胜千言: 就是酱紫: //打印领料表 void CKnifeDlgDlg::PrintCurUsedTabel(int order) { // TODO: Add your command handler code here char szFilters[] = "hgy Files (*.xls)|*.xls|All Files (*.*)|*.*||"; CFileDialog fileDlg (FALSE, "xls", ReadName + "

【转】VS2010下MFC的串口编程

串口通信简介 一般来说,计算机都有一个或多个串行端口,这些串口提供了外部设备与PC进行数据传输和通信的通道,在CPU和外设之间充当解释器的角色.当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据:当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据:当用通信控件或声明调用API函数时,它们由COMM.DRV解释并传递给设备驱动程序.作为一个程序员,要编写通信程序,只需知道通

MFC 操作excel 读写 感悟

在项目实现中,要操作excel 对表格进行读写,或者是将listcontrol控件里面的内容导入到表格中,为此在网上找了很多代码作为参考,但是都没有达到自己想要的效果! 在此,将自己在项目开发中遇到的问题和解决方法一一列出,希望能帮到其他人.    问题1   出现range等类的重定义,报错100多项 出错原因 主要是对于excel类库的多次添加导致,可以将类库删除后,重新添加.注意:在添加类中,应该添加自己需要的类,最好不要将类全部添加,否则程序运行会很慢. 同时,对于excel类库中类的操

VS2010下MFC的串口编程

串口通信简介 一般来说,计算机都有一个或多个串行端口,这些串口提供了外部设备与PC进行数据传输和通信的通道,在CPU和外设之间充当解释器的角色.当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据:当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据:当用通信控件或声明调用API函数时,它们由COMM.DRV解释并传递给设备驱动程序.作为一个程序员,要编写通信程序,只需知道通