|
一、BSTR、LPSTR和LPWSTR 那么什么是BSTR、LPSTR以及LPWSTR呢? BSTR(Basic STRing,Basic字符串)是一個OLECHAR*類型的Unicode字符串。它被描述成一個與自動化相兼容的類型。由于操作系統(tǒng)提供相應的API函數(shù)(如SysAllocString)來管理它以及一些默認的調度代碼,因此BSTR實際上就是一個COM字符串,但它卻在自動化技術以外的多種場合下得到廣泛使用。圖1描述了BSTR的結構,其中DWORD值是字符串中實際所占用的字節(jié)數(shù),且它的值是字符串中Unicode字符的兩倍。 LPSTR和LPWSTR是Win32和VC++所使用的一種字符串數(shù)據(jù)類型。LPSTR被定義成是一個指向以NULL(‘\0’)結尾的8位ANSI字符數(shù)組指針,而LPWSTR是一個指向以NULL結尾的16位雙字節(jié)字符數(shù)組指針。在VC++中,還有類似的字符串類型,如LPTSTR、LPCTSTR等,它們的含義如圖2所示。 例如,LPCTSTR是指“long pointer to a constant generic string”,表示“一個指向一般字符串常量的長指針類型”,與C/C++的const char*相映射,而LPTSTR映射為 char*。 一般地,還有下列類型定義: #ifdef UNICODE 二、CString、CStringA 和 CStringW Visual C++.NET中將CStringT作為ATL和MFC的共享的“一般”字符串類,它有CString、CStringA和CStringW三種形式,分別操作不同字符類型的字符串。這些字符類型是TCHAR、char和wchar_t。TCHAR在Unicode平臺中等同于WCHAR(16位Unicode字符),在ANSI中等價于char。wchar_t通常定義為unsigned short。由于CString在MFC應用程序中經(jīng)常用到,這里不再重復。 三、VARIANT、COleVariant 和_variant_t 在OLE、ActiveX和COM中,VARIANT數(shù)據(jù)類型提供了一種非常有效的機制,由于它既包含了數(shù)據(jù)本身,也包含了數(shù)據(jù)的類型,因而它可以實現(xiàn)各種不同的自動化數(shù)據(jù)的傳輸。下面讓我們來看看OAIDL.H文件中VARIANT定義的一個簡化版: struct tagVARIANT { 顯然,VARIANT類型是一個C結構,它包含了一個類型成員vt、一些保留字節(jié)以及一個大的union類型。例如,如果vt為VT_I2,那么我們可以從iVal中讀出VARIANT的值。同樣,當給一個VARIANT變量賦值時,也要先指明其類型。例如: VARIANT va; 為了方便處理VARIANT類型的變量,Windows還提供了這樣一些非常有用的函數(shù): VariantInit —— 將變量初始化為VT_EMPTY; VariantClear —— 消除并初始化VARIANT; VariantChangeType —— 改變VARIANT的類型; VariantCopy —— 釋放與目標VARIANT相連的內(nèi)存并復制源VARIANT。 COleVariant類是對VARIANT結構的封裝。它的構造函數(shù)具有極為強大大的功能,當對象構造時首先調用VariantInit進行初始化,然后根據(jù)參數(shù)中的標準類型調用相應的構造函數(shù),并使用VariantCopy進行轉換賦值操作,當VARIANT對象不在有效范圍時,它的析構函數(shù)就會被自動調用,由于析構函數(shù)調用了VariantClear,因而相應的內(nèi)存就會被自動清除。除此之外,COleVariant的賦值操作符在與VARIANT類型轉換中為我們提供極大的方便。例如下面的代碼: COleVariant v1("This is a test"); // 直接構造 _variant_t是一個用于COM的VARIANT類,它的功能與COleVariant相似。不過在Visual C++.NET的MFC應用程序中使用時需要在代碼文件前面添加下列兩句: #include "comutil.h" #pragma comment( lib, "comsupp.lib" ) 四、CComBSTR和_bstr_t CComBSTR是對BSTR數(shù)據(jù)類型封裝的一個ATL類,它的操作比較方便。例如: CComBSTR bstr1; _bstr_t是是C++對BSTR的封裝,它的構造和析構函數(shù)分別調用SysAllocString和SysFreeString函數(shù),其他操作是借用BSTR API函數(shù)。與_variant_t相似,使用時也要添加comutil.h和comsupp.lib。 五、BSTR、char*和CString轉換 (1) char*轉換成CString 若將char*轉換成CString,除了直接賦值外,還可使用CString::Format進行。例如: char chArray[] = "This is a test"; 或 LPSTR p = "This is a test"; 或在已定義Unicode應的用程序中 TCHAR * p = _T("This is a test"); 或 LPTSTR p = _T("This is a test"); (2) CString轉換成char* 若將CString類轉換成char*(LPSTR)類型,常常使用下列三種方法: 方法一,使用強制轉換。例如: CString theString( "This is a test" ); 方法二,使用strcpy。例如: CString theString( "This is a test" ); 需要說明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二個參數(shù)是 const wchar_t* (Unicode)或const char* (ANSI),系統(tǒng)編譯器將會自動對其進行轉換。 方法三,使用CString::GetBuffer。例如: CString s(_T("This is a test ")); (3) BSTR轉換成char* 方法一,使用ConvertBSTRToString。例如: #include 方法二,使用_bstr_t的賦值運算符重載。例如: _bstr_t b = bstrText; (4) char*轉換成BSTR 方法一,使用SysAllocString等API函數(shù)。例如: BSTR bstrText = ::SysAllocString(L"Test"); 方法二,使用COleVariant或_variant_t。例如: //COleVariant strVar("This is a test"); 方法三,使用_bstr_t,這是一種最簡單的方法。例如: BSTR bstrText = _bstr_t("This is a test"); 方法四,使用CComBSTR。例如: BSTR bstrText = CComBSTR("This is a test"); 或 CComBSTR bstr("This is a test"); 方法五,使用ConvertStringToBSTR。例如: char* lpszText = "Test"; (5) CString轉換成BSTR 通常是通過使用CStringT::AllocSysString來實現(xiàn)。例如: CString str("This is a test"); (6) BSTR轉換成CString 一般可按下列方法進行: BSTR bstrText = ::SysAllocString(L"Test"); 或 CStringA str(bstrText); (7) ANSI、Unicode和寬字符之間的轉換 方法一,使用MultiByteToWideChar將ANSI字符轉換成Unicode字符,使用WideCharToMultiByte將Unicode字符轉換成ANSI字符。 方法二,使用“_T”將ANSI轉換成“一般”類型字符串,使用“L”將ANSI轉換成Unicode,而在托管C++環(huán)境中還可使用S將ANSI字符串轉換成String*對象。例如: TCHAR tstr[] = _T("this is a test"); 方法三,使用ATL 7.0的轉換宏和類。ATL7.0在原有3.0基礎上完善和增加了許多字符串轉換宏以及提供相應的類,它具有如圖3所示的統(tǒng)一形式: 其中,第一個C表示“類”,以便于ATL 3.0宏相區(qū)別,第二個C表示常量,2表示“to”,EX表示要開辟一定大小的緩沖。SourceType和DestinationType可以是A、T、W和OLE,其含義分別是ANSI、Unicode、“一般”類型和OLE字符串。例如,CA2CT就是將ANSI轉換成一般類型的字符串常量。下面是一些示例代碼: LPTSTR tstr= CA2TEX<16>("this is a test"); |
|
|
來自: lawrence0303 > 《VC》