_variant_t与其他数据类型的转换

转自:http://kuaixingdong.blog.hexun.com/29627840_d.html

 

我们先看看COM所支持的一些类型的基本类:

(微软提供,在comdef.h中定义)

在COM中使用的标准类Class如下所示:

_bstr_t:对BSTR类型进行打包,并提供有用的操作和方法;

_com_error:定义抛出的error对象;

_com_ptr_t:封装COM接口指针

_variant_t:对VARIANT类型进行打包,并提供有用的操作和方法;

一、_variant_t类的简单介绍:

_variant_t对象封装了VARIANT数据类型。

The class manages resource allocation and deallocation and makes function calls to VariantInit and VariantClear as appropriate.

(1) _variant类提供的方法:

1> 构造函数

_variant_t

对_variant_t变量初始化调用的是_variant_t的构造函数。我们一般习惯于用一个int型的变量对数字类的变量进行初始化,这对_variant_t变量是不允许的。

原因很简单,_variant_t 的构造函数中没有用整型( Int )对其初始化的构造函数

可先将整型转化成long,然后再对其进行初始化

2> Attach()

Attaches a VARIANT object into the _variant_t object.

3> Clear()

Clears the encapsulated VARIANT object.

4> ChangeType

Changes the type of the _variant_t object to the indicated VARTYPE.

5> Detach

Detaches the encapsulated VARIANT object from this _variant_t object.

6> SetString

将一个string赋值给_variant_t对象;

7> Operators

赋值操作,给现有的_variant_t对象赋一个新值;

8> operator ==, !=

对比两个 _variant_t 对象是否相等;

9> Extractors

Extract data from the encapsulated VARIANT object.

(2) _variant_t的定义:

_variant_t类封闭了VARIANT数据类型,VARIANT是一个结构体类型,我们可以看一下它的定义

  1. typedef struct tagVARIANT   
  2. {  
  3.     VARTYPE vt;                             //存储数据类型  
  4.     unsigned short wReserved1;  
  5.     unsigned short wReserved2;  
  6.     unsigned short wReserved3;  
  7.     union   
  8.     {  
  9.         Byte bVal;                          // VT_UI1.  
  10.         Short iVal;                         // VT_I2.  
  11.         long lVal;                          // VT_I4.  
  12.         float fltVal;                       // VT_R4.  
  13.         double dblVal;                      // VT_R8.  
  14.         VARIANT_BOOL boolVal;               // VT_BOOL.  
  15.         SCODE scode;                        // VT_ERROR.  
  16.         CY cyVal;                           // VT_CY.  
  17.         DATE date;                          // VT_DATE.  
  18.         BSTR bstrVal;                       // VT_BSTR.  
  19.         DECIMAL FAR* pdecVal                // VT_BYREF|VT_DECIMAL.  
  20.         IUnknown FAR* punkVal;              // VT_UNKNOWN.  
  21.         IDispatch FAR* pdispVal;            // VT_DISPATCH.  
  22.         SAFEARRAY FAR* parray;              // VT_ARRAY|*.  
  23.         Byte FAR* pbVal;                    // VT_BYREF|VT_UI1.  
  24.         short FAR* piVal;                   // VT_BYREF|VT_I2.  
  25.         long FAR* plVal;                    // VT_BYREF|VT_I4.  
  26.         float FAR* pfltVal;                 // VT_BYREF|VT_R4.  
  27.         double FAR* pdblVal;                // VT_BYREF|VT_R8.  
  28.         VARIANT_BOOL FAR* pboolVal;         // VT_BYREF|VT_BOOL.  
  29.         SCODE FAR* pscode;                  // VT_BYREF|VT_ERROR.  
  30.         CY FAR* pcyVal;                     // VT_BYREF|VT_CY.  
  31.         DATE FAR* pdate;                    // VT_BYREF|VT_DATE.  
  32.         BSTR FAR* pbstrVal;                 // VT_BYREF|VT_BSTR.  
  33.         IUnknown FAR* FAR* ppunkVal;        // VT_BYREF|VT_UNKNOWN.  
  34.         IDispatch FAR* FAR* ppdispVal;      // VT_BYREF|VT_DISPATCH.  
  35.         SAFEARRAY FAR* FAR* pparray;        // VT_ARRAY|*.  
  36.         VARIANT FAR* pvarVal;               // VT_BYREF|VT_VARIANT.  
  37.         void FAR* byref;                    // Generic ByRef.  
  38.         char cVal;                          // VT_I1.  
  39.         unsigned short uiVal;               // VT_UI2.  
  40.         unsigned long ulVal;                // VT_UI4.  
  41.         int intVal;                         // VT_INT.  
  42.         unsigned int uintVal;               // VT_UINT.  
  43.         char FAR * pcVal;                   // VT_BYREF|VT_I1.  
  44.         unsigned short FAR * puiVal;        // VT_BYREF|VT_UI2.  
  45.         unsigned long FAR * pulVal;         // VT_BYREF|VT_UI4.  
  46.         int FAR * pintVal;                  // VT_BYREF|VT_INT.  
  47.         unsigned int FAR * puintVal;        //VT_BYREF|VT_UINT.  
  48.     };  
  49. };  
typedef struct tagVARIANT 
{
	VARTYPE vt;								//存储数据类型
	unsigned short wReserved1;
	unsigned short wReserved2;
	unsigned short wReserved3;
	union 
	{
		Byte bVal;							// VT_UI1.
		Short iVal;							// VT_I2.
		long lVal;							// VT_I4.
		float fltVal;						// VT_R4.
		double dblVal;						// VT_R8.
		VARIANT_BOOL boolVal;				// VT_BOOL.
		SCODE scode;						// VT_ERROR.
		CY cyVal;							// VT_CY.
		DATE date;							// VT_DATE.
		BSTR bstrVal;						// VT_BSTR.
		DECIMAL FAR* pdecVal				// VT_BYREF|VT_DECIMAL.
		IUnknown FAR* punkVal;				// VT_UNKNOWN.
		IDispatch FAR* pdispVal;			// VT_DISPATCH.
		SAFEARRAY FAR* parray;				// VT_ARRAY|*.
		Byte FAR* pbVal;					// VT_BYREF|VT_UI1.
		short FAR* piVal;					// VT_BYREF|VT_I2.
		long FAR* plVal;					// VT_BYREF|VT_I4.
		float FAR* pfltVal;					// VT_BYREF|VT_R4.
		double FAR* pdblVal;				// VT_BYREF|VT_R8.
		VARIANT_BOOL FAR* pboolVal;			// VT_BYREF|VT_BOOL.
		SCODE FAR* pscode;					// VT_BYREF|VT_ERROR.
		CY FAR* pcyVal;						// VT_BYREF|VT_CY.
		DATE FAR* pdate;					// VT_BYREF|VT_DATE.
		BSTR FAR* pbstrVal;					// VT_BYREF|VT_BSTR.
		IUnknown FAR* FAR* ppunkVal;		// VT_BYREF|VT_UNKNOWN.
		IDispatch FAR* FAR* ppdispVal;		// VT_BYREF|VT_DISPATCH.
		SAFEARRAY FAR* FAR* pparray;		// VT_ARRAY|*.
		VARIANT FAR* pvarVal;				// VT_BYREF|VT_VARIANT.
		void FAR* byref;					// Generic ByRef.
		char cVal;							// VT_I1.
		unsigned short uiVal;				// VT_UI2.
		unsigned long ulVal;				// VT_UI4.
		int intVal;							// VT_INT.
		unsigned int uintVal;				// VT_UINT.
		char FAR * pcVal;					// VT_BYREF|VT_I1.
		unsigned short FAR * puiVal;		// VT_BYREF|VT_UI2.
		unsigned long FAR * pulVal;			// VT_BYREF|VT_UI4.
		int FAR * pintVal;					// VT_BYREF|VT_INT.
		unsigned int FAR * puintVal;		//VT_BYREF|VT_UINT.
	};
};
注意:vt用来存储内部变量(联合体中保存的变量)的类型,联合体用来存储对应类型的值

二、数据类型转换

_bstr_t类可以作为_variant_t类与基本数据类型转换的中介

(1) _variant_t与CString之间的转化

1> CString转换为_variant_t:

  1. CString str;  
  2. _variant_t str1=(LPCTSTR)str;   
CString str;
_variant_t str1=(LPCTSTR)str; 
使用_variant_t的成员函数SetString来对_variant_t的对象赋值会更好;

2> _variant_t转换为CString:

  1. _variant_t vt;  
  2. CString tempstr=(LPCSTR)_bstr_t(vt);         //_bstr_t的构造函数有对_variant_t类型的处理  
_variant_t vt;
CString tempstr=(LPCSTR)_bstr_t(vt);         //_bstr_t的构造函数有对_variant_t类型的处理

(2) _variant_t与char *之间的转换

1> char * 转换为_variant_t

方法与CString转换为_variant_t的方法类似:

  1. char * cValue;  
  2. _variant_t vValue=(LPSTR)cValue;  
char * cValue;
_variant_t vValue=(LPSTR)cValue;
2> _variant_t转换为char *:

错误方法:

  1. _variant_t vValue;  
  2. char * value=(LPSTR)(LPCSTR)_bstr_t(vValue)  
_variant_t vValue;
char * value=(LPSTR)(LPCSTR)_bstr_t(vValue)

value指向一堆乱码...

原因:不能用char *直接指向(LPSTR)(LPCSTR)_bstr_t( _variant_t ),因为这样转换之后实际上是一个string,而非一个char *

正确方法:

进行转换时,只能用strcpy(),将LPSTR指向的字符复制到char * 所指向的内存中;

如下例:

  1. _variant_t vValue;  
  2. char cValue[16]={0};  
  3. strcpy(cValue, (LPCSTR)_bstr_t(vValue));  
_variant_t vValue;
char cValue[16]={0};
strcpy(cValue, (LPCSTR)_bstr_t(vValue));

(3) 判断_variant_t的值类型

下面的转换代码根据_variant_t的vt进行类型判断,然后将数据值转换为CString类型(可作为转换为其他数据类型的中介)

  1. CString str;  
  2.   
  3. //以下代码演示如何转换为C标准字符串型  
  4. switch(var.vt)  
  5. {  
  6.     case VT_BSTR:  
  7.     {  
  8.         str=var.bstrVal;  
  9.         break;  
  10.     }  
  11.     case VT_I2: //var is short int type   
  12.     {  
  13.         str.Format("%d",(int)var.iVal);  
  14.         break;  
  15.     }  
  16.     case VT_I4: //var is long int type  
  17.     {  
  18.         str.Format("%d", var.lVal);  
  19.         break;  
  20.     }  
  21.     case VT_R4: //var is float type  
  22.     {  
  23.         str.Format("%10.6f", (double)var.fltVal);  
  24.         break;  
  25.     }  
  26.     case VT_R8: //var is double type  
  27.     {  
  28.         str.Format("%10.6f", var.dblVal);  
  29.         break;  
  30.     }  
  31.     case VT_CY: //var is CY type  
  32.     {  
  33.         str=COleCurrency(var).Format();  
  34.         break;  
  35.     }  
  36.     case VT_DATE: //var is DATE type  
  37.     {  
  38.         str=COleDateTime(var).Format();  
  39.         break;  
  40.     }  
  41.     case VT_BOOL: //var is VARIANT_BOOL  
  42.     {  
  43.         str= (var.boolVal==0) ?"FALSE""TRUE";  
  44.         break;  
  45.     }  
  46.     default:  
  47.     {  
  48.         str.Format("Unk type %d\n",var.vt);  
  49.         TRACE("Unknown type %d\n",var.vt);  
  50.         break;  
  51.     }  
  52. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值