字串轉換系列三: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" )