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

  三、VARIANT、COleVariant 和_variant_t

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

struct tagVARIANT {
 VARTYPE vt;
 union {
  short iVal; // VT_I2.
  long lVal; // VT_I4.
  float fltVal; // VT_R4.
  double dblVal; // VT_R8.
  DATE date; // VT_DATE.
  BSTR bstrVal; // VT_BSTR.
  …
  short * piVal; // VT_BYREF|VT_I2.
  long * plVal; // VT_BYREF|VT_I4.
  float * pfltVal; // VT_BYREF|VT_R4.
  double * pdblVal; // VT_BYREF|VT_R8.
  DATE * pdate; // VT_BYREF|VT_DATE.
  BSTR * pbstrVal; // VT_BYREF|VT_BSTR.
 };
};

  显然,VARIANT类型是一个C结构,它包含了一个类型成员vt、一些保留字节以及一个大的union类型。例如,如果vt为VT_I2,那么我们可以从iVal中读出VARIANT的值。同样,当给一个VARIANT变量赋值时,也要先指明其类型。例如:

VARIANT va;
:: VariantInit(&va); // 初始化
int a = 2002;
va.vt = VT_I4; // 指明long数据类型
va.lVal = a; // 赋值

  为了方便处理VARIANT类型的变量,Windows还提供了这样一些非常有用的函数:

  VariantInit —— 将变量初始化为VT_EMPTY;

  VariantClear —— 消除并初始化VARIANT;

  VariantChangeType —— 改变VARIANT的类型;

  VariantCopy —— 释放与目标VARIANT相连的内存并复制源VARIANT。

  COleVariant类是对VARIANT结构的封装。它的构造函数具有极为强大大的功能,当对象构造时首先调用VariantInit进行初始化,然后根据参数中的标准类型调用相应的构造函数,并使用VariantCopy进行转换赋值操作,当VARIANT对象不在有效范围时,它的析构函数就会被自动调用,由于析构函数调用了VariantClear,因而相应的内存就会被自动清除。除此之外,COleVariant的赋值操作符在与VARIANT类型转换中为我们提供极大的方便。例如下面的代码:

COleVariant v1("This is a test"); // 直接构造
COleVariant v2 = "This is a test";
// 结果是VT_BSTR类型,值为"This is a test"
COleVariant v3((long)2002);
COleVariant v4 = (long)2002;
// 结果是VT_I4类型,值为2002

  _variant_t是一个用于COM的VARIANT类,它的功能与COleVariant相似。不过在Visual C++.NET的MFC应用程序中使用时需要在代码文件前面添加下列两句:

  #include "comutil.h"

  #pragma comment( lib, "comsupp.lib" )

 
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在进行 time_t,CTime,SYSTEMTIME,COleDateTime,COleVariant 之间的转换时,需要使用不同的头文件和函数。下面是它们之间的转换代码及讲解: 1. time_t 转 CTime time_t 是一个表示时间的整数类型,在 C++ 标准库中经常使用。CTime 是 MFC 中表示时间的类,可以表示年、月、日、时、分和秒。 头文件: ``` #include <time.h> #include <afx.h> ``` 代码: ``` time_t t = time(NULL); CTime ct(t); ``` 解释: 首先获取当前时间的 time_t 类型的值 t。然后使用 CTime 的构造函数将 t 转换为 CTime 类型的对象 ct。 2. CTime 转 SYSTEMTIME SYSTEMTIME 是 Windows API 中用于表示时间的结构体,包含年、月、日、时、分和秒等信息。 头文件: ``` #include <afx.h> ``` 代码: ``` CTime ct = CTime::GetCurrentTime(); SYSTEMTIME st; ct.GetAsSystemTime(st); ``` 解释: 首先获取当前时间的 CTime 类型的对象 ct。然后使用 CTime 的 GetAsSystemTime 函数将 ct 转换为 SYSTEMTIME 类型的对象 st。 3. SYSTEMTIME 转 CTime 同样可以使用 CTime 的构造函数将 SYSTEMTIME 类型的对象转换为 CTime 类型的对象。 头文件: ``` #include <afx.h> ``` 代码: ``` SYSTEMTIME st; GetSystemTime(&st); CTime ct(st); ``` 解释: 首先使用 Windows API 的 GetSystemTime 函数获取当前时间的 SYSTEMTIME 类型的值 st。然后使用 CTime 的构造函数将 st 转换为 CTime 类型的对象 ct。 4. CTime 转 COleDateTime COleDateTime 是 MFC 中表示日期和时间的类,可以表示年、月、日、时、分、秒和毫秒。 头文件: ``` #include <afx.h> ``` 代码: ``` CTime ct = CTime::GetCurrentTime(); COleDateTime od(ct); ``` 解释: 首先获取当前时间的 CTime 类型的对象 ct。然后使用 COleDateTime 的构造函数将 ct 转换为 COleDateTime 类型的对象 od。 5. COleDateTime 转 CTime 同样可以使用 CTime 的构造函数将 COleDateTime 类型的对象转换为 CTime 类型的对象。 头文件: ``` #include <afx.h> ``` 代码: ``` COleDateTime od = COleDateTime::GetCurrentTime(); CTime ct(od.GetYear(), od.GetMonth(), od.GetDay(), od.GetHour(), od.GetMinute(), od.GetSecond()); ``` 解释: 首先获取当前时间的 COleDateTime 类型的对象 od。然后使用 COleDateTime 的 GetYear、GetMonth、GetDay、GetHour、GetMinute 和 GetSecond 函数获取年、月、日、时、分和秒等信息,并使用 CTime 的构造函数将这些信息转换为 CTime 类型的对象 ct。 6. CTime 转 COleVariant COleVariantMFC 中用于封装 VARIANT 类型的类,可以表示各种数据类型。 头文件: ``` #include <afx.h> ``` 代码: ``` CTime ct = CTime::GetCurrentTime(); COleVariant ov(ct); ``` 解释: 首先获取当前时间的 CTime 类型的对象 ct。然后使用 COleVariant 的构造函数将 ct 转换为 COleVariant 类型的对象 ov。 以上就是 time_t,CTime,SYSTEMTIME,COleDateTime,COleVariant 之间的转换代码及讲解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值