_bstr_t

_bstr_t類封裝BSTR有趣的地方就是它的封裝方式有點類似於智慧型指針,又有點像COM管理生存期的方式。_bstr_t將兩者結合起來並具體體現在構造函式、賦值函式和析構函式中。VARIANT和BSTR這兩種類型是COM中使用的數據類型。為了C++中的變數套用到ADO編程中,只能進行數據類型的轉換。BSTR是COM中用來表示UNICODE編碼的字元串。在_bstr_t內部,定義了一個私有類Data_t,和一個私有的成員變數Data_t* m_Data,這就有些像智慧型指針的做法了。當然,當引用計數減到0時,m_Data指針所指的對象也就析構了。

簡介

_variant_t和_bstr_t這兩個類分別封裝並管理VARIANT和BSTR這兩種數據類型,

VARIANT和BSTR這兩種類型是COM中使用的數據類型。

為了C++中的變數套用到ADO編程中,只能進行數據類型的轉換。

通過_variant_t和_bstr_t這兩個類,就可以方便的把C++類型變數轉換成COM中的變數了

ADO是基於COM接口x實現的。因此它的使用對於正在進行的 COM編程的程式設計師而言更簡單

COM是使用其特定的數據類型,_bstr_t是其中一種源類型

其他類型轉換成_bstr_t可以直接賦值。

例子_bstr_t bstr(“程式設計師”);

const char *buf=bstrVar; //不要修改buf中內容AfxMessageBox(buf);

//////////////////////////////////////////////////////////////////////////////

//

// Wrapper class for BSTR

//

//////////////////////////////////////////////////////////////////////////////

說明這個類的用途是封裝COM中最常用的BSTR類型。BSTR是COM中用來表示UNICODE編碼的字元串。下面的宏定義說明了BSTR的真正類型。

typedef unsigned short wchar_t

typedef wchar_t WCHAR;

typedef WCHAR OLECHAR;

typedef OLECHAR* BSTR;

不過BSTR類型並非是簡單的一個指針,一個BSTR字元串的前面有4個位元組的長度位,而且BSTR字元串的分配和釋放也需要專門的API來執行。那么_bstr_t類是怎么封裝(warp)了BSTR類型的呢?

_bstr_t類封裝BSTR有趣的地方就是它的封裝方式有點類似於智慧型指針,又有點像COM管理生存期的方式。

說它像智慧型指針,是因為智慧型指針通常都在內部維護了一個指針來指向指向任意的一種類型,當智慧型指針自己釋放時,它的析構函式會釋放掉內部指針所指的空間。在_bstr_t內部,定義了一個私有類Data_t,和一個私有的成員變數Data_t* m_Data,這就有些像智慧型指針的做法了。然而智慧型指針通常都是用模板來實現類型通用,_bstr_t通過定義私有類的方式實現了管理BSTR的專用性。

說它像COM的coclass,是因為Data_t類的兩個成員函式AddRef()和Release(),而且這兩個成員函式的實現使用的是和COM一樣的方式:InterlockedIncrement和InterlockedDecrement。怎么樣,是不是一看到它們就想起了COM?

_bstr_t把這兩點結合起來的地方在它的幾種函式中:構造函式,賦值函式,析構函式。

賦值函式

每次賦值,都要改變內部的m_Data指針的值。所以每次賦值都需要調用_Free來將m_Data指針所指的對象的引用計數減1。當然,當引用計數減到0時,m_Data指針所指的對象也就析構了。然而,有個特殊的賦值函式,它的參數是_bstr_t類型。在這個函式內,需要將參數的m_Data指針指向的對象引用計數加1。注意函式內用到了參數的私有變數,因為參數的類型也是_bstr_t。

相關詞條

熱門詞條

聯絡我們