1. 程式人生 > >字串轉換系列三:VARIANT、COleVariant 和_variant_t

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