




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、VC 字符串轉換所屬類別:VC+推薦指數(shù):文檔人氣:19495本周人氣:66發(fā)布日期:2006-3-11一、 BSTR 、 LPSTR 和 LPWSTR在 Visual C+.NET的所有編程方式中, 我們常常要用到這樣的一些基本字符串類型, 如 BSTR 、 LPSTR 和 LPWSTR 等。之所以出現(xiàn)類似上述的這些數(shù)據(jù)類型,是因為不同編程語言之間的數(shù)據(jù)交 換以及對 ANSI 、 Unicode 和多字節(jié)字符集 (MBCS的支持。那么什么是 BSTR 、 LPSTR 以及 LPWSTR 呢?BSTR(Basic STRing, Basic 字符串 是一個 OLECHAR*類型的 Unicod
2、e 字符串。 它被描述成一個 與自動化相兼容的類型。由于操作系統(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 是一個指向以 NU
3、LL 結尾的 16位雙字節(jié)字符數(shù)組指針。在 VC+中,還有類似的字符串類型,如 LPTSTR 、 LPCTSTR 等,它們的 含義如圖 2所示。例如, LPCTSTR 是指“ long pointer to a constant generic string” ,表示“一個指向一般字符串常 量的長指針類型” ,與 C/C+的 const char*相映射,而 LPTSTR 映射為 char*。一般地,還有下列類型定義:#ifdef UNICODEtypedef LPWSTR LPTSTR;typedef LPCWSTR LPCTSTR;#elsetypedef LPSTR LPTSTR;typ
4、edef LPCSTR LPCTSTR;#endif二、 CString 、 CStringA 和 CStringWVisual C+.NET中將 CStringT 作為 ATL 和 MFC 的共享的“一般”字符串類,它有 CString 、 CStringA 和 CStringW 三種形式,分別操作不同字符類型的字符串。這些字符類型是 TCHAR 、 char 和 wchar_t。 TCHAR 在 Unicode 平臺中等同于 WCHAR(16位 Unicode 字符 , 在 ANSI 中等價于 char 。wchar_t通常定義為 unsigned short。由于 CString 在 M
5、FC 應用程序中經常用到,這里不再重復。 三、 V ARIANT 、 COleVariant 和 _variant_t在 OLE 、 ActiveX 和 COM 中, V ARIANT 數(shù)據(jù)類型提供了一種非常有效的機制,由于它既包含 了數(shù)據(jù)本身,也包含了數(shù)據(jù)的類型,因而它可以實現(xiàn)各種不同的自動化數(shù)據(jù)的傳輸。下面讓我們來 看看 OAIDL.H 文件中 V ARIANT 定義的一個簡化版:struct tagVARIANT V ARTYPE vt;union short iVal; / VT_I2.long lVal; / VT_I4.float fltVal; / VT_R4.double db
6、lVal; / 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.;顯然, V ARIANT 類型是一個 C 結構,它包含了一個類型成員 vt 、
7、一些保留字節(jié)以及一個大的 union 類型。例如,如果 vt 為 VT_I2,那么我們可以從 iVal 中讀出 V ARIANT 的值。同樣,當給一 個 V ARIANT 變量賦值時,也要先指明其類型。例如:V ARIANT va;: VariantInit(&va; / 初始化int a = 2002;va.vt = VT_I4; / 指明 long 數(shù)據(jù)類型va.lVal = a; / 賦值為了方便處理 V ARIANT 類型的變量, Windows 還提供了這樣一些非常有用的函數(shù):VariantInit 將變量初始化為 VT_EMPTY;VariantClear 消除并初始化 V
8、 ARIANT;VariantChangeType 改變 V ARIANT 的類型 ;VariantCopy 釋放與目標 V ARIANT 相連的內存并復制源 VARIANT 。COleVariant 類是對 V ARIANT 結構的封裝。它的構造函數(shù)具有極為強大大的功能,當對象構造 時首先調用 VariantInit 進行初始化,然后根據(jù)參數(shù)中的標準類型調用相應的構造函數(shù),并使用 VariantCopy 進行轉換賦值操作, 當 V ARIANT 對象不在有效范圍時, 它的析構函數(shù)就會被自動調用, 由于析構函數(shù)調用了 VariantClear , 因而相應的內存就會被自動清除。 除此之外, C
9、OleVariant 的賦值 操作符在與 V ARIANT 類型轉換中為我們提供極大的方便。例如下面的代碼:COleVariant v1("This is a test" / 直接構造COleVariant v2 = "This is a test"/ 結果是 VT_BSTR類型,值為 "This is a test"COleVariant v3(long2002;COleVariant v4 = (long2002;/ 結果是 VT_I4類型,值為 2002_variant_t是一個用于 COM 的 V ARIANT 類,它的功能與
10、 COleVariant 相似。不過在 Visual C+.NET的 MFC 應用程序中使用時需要在代碼文件前面添加下列兩句:#include "comutil.h"#pragma comment( lib, "comsupp.lib" 四、 CComBSTR 和 _bstr_tCComBSTR 是對 BSTR 數(shù)據(jù)類型封裝的一個 ATL 類,它的操作比較方便。例如:CComBSTR bstr1;bstr1 = "Bye" / 直接賦值OLECHAR* str = OLESTR("ta ta" / 長度為 5的寬字
11、符CComBSTR bstr2(wcslen(str; / 定義長度為 5wcscpy(bstr2.m_str, str; / 將寬字符串復制到 BSTR 中CComBSTR bstr3(5, OLESTR("Hello World"CComBSTR bstr4(5, "Hello World"CComBSTR bstr5(OLESTR("Hey there"CComBSTR bstr6("Hey there"CComBSTR bstr7(bstr6;/ 構造時復制,內容為 "Hey there"
12、;_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"char * p = "
13、;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"CString theString = chArray;theString.Format(_T("%s", chArray;theString = p;(2 CString轉換成 char*若將 CString 類轉換成 char*(LPSTR類型,常常使用下
14、列三種方法:方法一,使用強制轉換。例如:CString theString( "This is a test" ;LPTSTR lpsz =(LPTSTR(LPCTSTRtheString;方法二,使用 strcpy 。例如:CString theString( "This is a test" ;LPTSTR lpsz = new TCHARtheString.GetLength(+1;_tcscpy(lpsz, theString;需要說明的是, strcpy(或可移值 Unicode/MBCS的 _tcscpy的第二個參數(shù)是 const wchar
15、_t* (Unicode或 const char* (ANSI,系統(tǒng)編譯器將會自動對其進行轉換。方法三,使用 CString:GetBuffer。例如:CString s(_T("This is a test "LPTSTR p = s.GetBuffer(;/ 在這里添加使用 p 的代碼if(p != NULL *p = _T('0's.ReleaseBuffer(;/ 使用完后及時釋放,以便能使用其它的 CString 成員函數(shù) (3 BSTR轉換成 char*方法一,使用 ConvertBSTRToString 。例如:#include#pragma
16、comment(lib, "comsupp.lib"int _tmain(int argc, _TCHAR* argvBSTR bstrText = :SysAllocString(L"Test"char* lpszText2 = _com_util:ConvertBSTRToString(bstrText; SysFreeString(bstrText; / 用完釋放delete lpszText2;return 0;方法二,使用 _bstr_t的賦值運算符重載。例如:_bstr_t b = bstrText;char* lpszText2 = b;(
17、4 char*轉換成 BSTR方法一,使用 SysAllocString 等 API 函數(shù)。例如:BSTR bstrText = :SysAllocString(L"Test"BSTR bstrText = :SysAllocStringLen(L"Test",4;BSTR bstrText = :SysAllocStringByteLen("Test",4;方法二,使用 COleVariant 或 _variant_t。例如:/COleVariant strVar("This is a test"_variant
18、_t strVar("This is a test"BSTR bstrText = strVar.bstrVal;方法三,使用 _bstr_t,這是一種最簡單的方法。例如: BSTR bstrText = _bstr_t("This is a test"方法四,使用 CComBSTR 。例如:BSTR bstrText = CComBSTR("This is a test" 或 CComBSTR bstr("This is a test" BSTR bstrText = bstr.m_str; 方法五,使用 Con
19、vertStringToBSTR。例如: char* lpszText = "Test" BSTR bstrText = _com_util:ConvertStringToBSTR(lpszText; (5 CString 轉換成 BSTR 通常是通過使用 CStringT:AllocSysString 來實現(xiàn)。例如: CString str("This is a test" BSTR bstrText = str.AllocSysString(; SysFreeString(bstrText; / 用完釋放 (6 BSTR 轉換成 CString 一般可按下列方法進行: BSTR bstrText = :SysAllocString(L"Test" CStringA str; str.Empty(; str = bstrText; 或 CStringA str(bstrText; (7 ANSI、Unicode 和寬字符之間的轉換 方法一, 使用 MultiByteToWideChar 將 ANSI 字符轉換成 Unicode 字符, 使用 WideCharToMultiByte 將 Unicode 字符轉換成 ANSI 字符。 方法二,使用“_T”將 A
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 論建設工程合同的法律問題
- 便利店加盟合同書樣本2025
- 深圳二手房買賣合同要點
- 人才合作合同
- 云南省迪慶2024-2025學年高三下學期第二次調研考試英語試題含解析
- 上海戲劇學院《藥物合成反應C》2023-2024學年第二學期期末試卷
- 江西省南昌市10所省重點2025年高三下學期暑假聯(lián)考物理試題含解析
- 濰坊理工學院《云南原生態(tài)民族音樂》2023-2024學年第一學期期末試卷
- 宿松縣2024-2025學年小學六年級第二學期小升初數(shù)學試卷含解析
- 二手房產合同轉讓協(xié)議書
- 以茶為媒的小學跨學科教育研究
- 2024年度高速公路機電設備維護合同:某機電公司負責某段高速公路的機電設備維護2篇
- 中考道德與法治復習題型專項漫畫式課件
- DB21-T 2885-2023 居住建筑節(jié)能設計標準
- 小學二年級-心理健康教育-10-我能堅持-教學課件
- 標準離婚協(xié)議書格式樣本模板
- 電池制造工(電池(組)裝配工)行業(yè)職業(yè)技能競賽理論考試題庫及答案
- 基于“三新”背景下的2025屆新高考物理復習備考策略-課件
- 2024年海洋知識競賽題庫及答案(共70題)
- 應急管理數(shù)據(jù)標準化與共享
- Unit 5 Humans and nature Lesson 3 Race to the Pole 教學設計-2023-2024學年高中英語北師大版(2019)必修第二冊
評論
0/150
提交評論