_tvariant_t與其他類型互轉

_variant_t的定義:

_variant_t類封閉了VARIANT數據類型,VARIANT是一個結構體類型,我們可以看一下它的定義

typedef struct tagVARIANT   
  1. {  
  2.     VARTYPE vt;                             //存儲數據類型   
  3.     unsigned short wReserved1;  
  4.     unsigned short wReserved2;  
  5.     unsigned short wReserved3;  
  6.     union   
  7.     {  
  8.         Byte bVal;                          // VT_UI1.   
  9.         Short iVal;                         // VT_I2.   
  10.         long lVal;                          // VT_I4.   
  11.         float fltVal;                       // VT_R4.   
  12.         double dblVal;                      // VT_R8.   
  13.         VARIANT_BOOL boolVal;               // VT_BOOL.   
  14.         SCODE scode;                        // VT_ERROR.   
  15.         CY cyVal;                           // VT_CY.   
  16.         DATE date;                          // VT_DATE.   
  17.         BSTR bstrVal;                       // VT_BSTR.   
  18.         DECIMAL FAR* pdecVal                // VT_BYREF|VT_DECIMAL.   
  19.         IUnknown FAR* punkVal;              // VT_UNKNOWN.   
  20.         IDispatch FAR* pdispVal;            // VT_DISPATCH.   
  21.         SAFEARRAY FAR* parray;              // VT_ARRAY|*.   
  22.         Byte FAR* pbVal;                    // VT_BYREF|VT_UI1.   
  23.         short FAR* piVal;                   // VT_BYREF|VT_I2.   
  24.         long FAR* plVal;                    // VT_BYREF|VT_I4.   
  25.         float FAR* pfltVal;                 // VT_BYREF|VT_R4.   
  26.         double FAR* pdblVal;                // VT_BYREF|VT_R8.   
  27.         VARIANT_BOOL FAR* pboolVal;         // VT_BYREF|VT_BOOL.   
  28.         SCODE FAR* pscode;                  // VT_BYREF|VT_ERROR.   
  29.         CY FAR* pcyVal;                     // VT_BYREF|VT_CY.   
  30.         DATE FAR* pdate;                    // VT_BYREF|VT_DATE.   
  31.         BSTR FAR* pbstrVal;                 // VT_BYREF|VT_BSTR.   
  32.         IUnknown FAR* FAR* ppunkVal;        // VT_BYREF|VT_UNKNOWN.   
  33.         IDispatch FAR* FAR* ppdispVal;      // VT_BYREF|VT_DISPATCH.   
  34.         SAFEARRAY FAR* FAR* pparray;        // VT_ARRAY|*.   
  35.         VARIANT FAR* pvarVal;               // VT_BYREF|VT_VARIANT.   
  36.         void FAR* byref;                    // Generic ByRef.   
  37.         char cVal;                          // VT_I1.   
  38.         unsigned short uiVal;               // VT_UI2.   
  39.         unsigned long ulVal;                // VT_UI4.   
  40.         int intVal;                         // VT_INT.   
  41.         unsigned int uintVal;               // VT_UINT.   
  42.         char FAR * pcVal;                   // VT_BYREF|VT_I1.   
  43.         unsigned short FAR * puiVal;        // VT_BYREF|VT_UI2.   
  44.         unsigned long FAR * pulVal;         // VT_BYREF|VT_UI4.   
  45.         int FAR * pintVal;                  // VT_BYREF|VT_INT.   
  46.         unsigned int FAR * puintVal;        //VT_BYREF|VT_UINT.   
  47.     };  
  48. };  
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. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章