談ATL(二)--BSTR與CComBSTR

關於BSTR類數組

BSTR類型的實質是指向一個帶長度前綴的OLECHAR字符數組的指針。ide

BSTR是指針數據類型。它指向數組的第一個字符,長度是以整數存儲的數據中緊接第一個字符前面的位置。函數

BSTR中的字符數組以NUL字符結束。工具

前綴長度以字節單位,描述的是字符串的長度,該長度不包括終止字符NUL。指針

字符數組內部能夠包括有效的NUL字符。開發

BSTR必須使用SysAllocString和SysFreeString函數族進行分配和釋放。字符串

NULL的BSTR指針表示空字符串。簡單講就是BSTR *p = NULL 等同於 BSTR *p = "";原型

BSTR是非引用計數的,兩次引用同一字符串的內容必須指向兩個單獨的BSTR,也就是說BSTR自己實現的是深拷貝。it

 

關於CComBSTR類class

CComBSTR是ATL的工具類,它封裝了COM字符串數據類型BSTR,CComBSTR的定義參見「atlcomcli.h」。

CComBSTR的部分定義以下:

class CComBSTR

{

public:

    BSTR m_str;

...

}

其中,維護的數據成員只有一個BSTR,爲了和其餘的字符串類轉換和提升通用性,CComBSTR共提供了八個構造函數,以下:

CComBSTR()  //將m_str初始化爲NULL

CComBSTR(LPCOLESTR pSrc)  //用LPCOLESTR初始化m_str

CComBSTR(int nSize, LPOLESR sz)//去LPOLESTR前nSize個字符初始化m_str

CComBSTR(int nSize)   //初始化m_str的空間爲nSize

CComBSTR(LPCSTR pSrc)//用LPCSTR字符串初始化m_str

CComBSTR(int nSize, LPCSTR sz)//用LPCSTR的前nSize個字符初始化m_str

CComBSTR(const CComBSTR& src) //拷貝構造函數

 

BSTR字符串在應用上並非新的應用,而是有很長曆史了,在VB(在上大學時第一個商業程序就是用VB開發的,因此對於VB程序當時是情有獨鍾,對於內部原理也算略知一二)和JAVA(JAVA是大學的課程雖然講的很少,但也用其作過一些小的應用和項目,一些皮毛的東西還算了解)中的字符串類型都用的BSTR。不過在C++中用BSTR就不是那麼方便了,若是想將BSTR類型的字符串轉換爲C++能用的char*類型,其實也不用本身寫轉換函數或轉換類,不少IDE環境就有現成的類庫支持,下面介紹一種簡單方便的:

#include "comutil.h"
#pragma comment(lib, "comsupp.lib")

::_com_util::ConvertBSTRToString(BSTR類型的變量)

::_com_util::ConvertStringToBSTR(const char*類型)

 

具體的函數原型以下:

// Convert char * to BSTR
 //
 BSTR __stdcall ConvertStringToBSTR(const char* pSrc) throw(_com_error);

 // Convert BSTR to char *
 //
 char* __stdcall ConvertBSTRToString(BSTR pSrc) throw(_com_error);

 

至於函數的具體參數和使用細節,只要寫入IDE環境後,自動的代碼提示會幫你解決這些問題。

相關文章
相關標籤/搜索