![VC字符串轉(zhuǎn)換_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/975eb529-a70c-4370-bcb1-32f6ef3f4fc3/975eb529-a70c-4370-bcb1-32f6ef3f4fc31.gif)
![VC字符串轉(zhuǎn)換_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/975eb529-a70c-4370-bcb1-32f6ef3f4fc3/975eb529-a70c-4370-bcb1-32f6ef3f4fc32.gif)
![VC字符串轉(zhuǎn)換_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/975eb529-a70c-4370-bcb1-32f6ef3f4fc3/975eb529-a70c-4370-bcb1-32f6ef3f4fc33.gif)
![VC字符串轉(zhuǎn)換_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/975eb529-a70c-4370-bcb1-32f6ef3f4fc3/975eb529-a70c-4370-bcb1-32f6ef3f4fc34.gif)
![VC字符串轉(zhuǎn)換_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/975eb529-a70c-4370-bcb1-32f6ef3f4fc3/975eb529-a70c-4370-bcb1-32f6ef3f4fc35.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、VC 字符串轉(zhuǎn)換所屬類別: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)提供相應(yīng)的 API 函數(shù) (如 SysAllocString 來管理它以及一些默 認的調(diào)度代碼,因此 BSTR 實際上就是一個 COM 字符串,但它卻在自動化技術(shù)以外的多種場合下 得到廣泛使用。圖 1描述了 BSTR 的結(jié)構(gòu),其中 DWORD 值是字符串中實際所占用的字節(jié)數(shù),且它 的值是字符串中 Unicode 字符的兩倍。LPSTR 和 LPWSTR 是 Win32和 VC+所使用的一種字符串數(shù)據(jù)類型。 LPSTR 被定義成是一個 指向以 NULL( 0 結(jié)尾的 8位 ANSI 字符數(shù)組指針,而 LPWSTR 是一個指向以 NU
3、LL 結(jié)尾的 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 應(yīng)用程序中經(jīng)常用到,這里不再重復(fù)。 三、 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 結(jié)構(gòu),它包含了一個類型成員 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 ARI
8、ANT;VariantChangeType 改變 V ARIANT 的類型 ;VariantCopy 釋放與目標 V ARIANT 相連的內(nèi)存并復(fù)制源 VARIANT 。COleVariant 類是對 V ARIANT 結(jié)構(gòu)的封裝。它的構(gòu)造函數(shù)具有極為強大大的功能,當對象構(gòu)造 時首先調(diào)用 VariantInit 進行初始化,然后根據(jù)參數(shù)中的標準類型調(diào)用相應(yīng)的構(gòu)造函數(shù),并使用 VariantCopy 進行轉(zhuǎn)換賦值操作, 當 V ARIANT 對象不在有效范圍時, 它的析構(gòu)函數(shù)就會被自動調(diào)用, 由于析構(gòu)函數(shù)調(diào)用了 VariantClear , 因而相應(yīng)的內(nèi)存就會被自動清除。 除此之外, COleV
9、ariant 的賦值 操作符在與 V ARIANT 類型轉(zhuǎn)換中為我們提供極大的方便。例如下面的代碼:COleVariant v1(This is a test; / 直接構(gòu)造COleVariant v2 = This is a test;/ 結(jié)果是 VT_BSTR類型,值為 This is a testCOleVariant v3(long2002;COleVariant v4 = (long2002;/ 結(jié)果是 VT_I4類型,值為 2002_variant_t是一個用于 COM 的 V ARIANT 類,它的功能與 COleVariant 相似。不過在 Visual C+.NET的 MFC
10、 應(yīng)用程序中使用時需要在代碼文件前面添加下列兩句:#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的寬字符CComBSTR bstr2(wcslen(str; / 定義長度為 5wcscpy(bstr2.m_str, str; / 將寬字符串復(fù)制到 BSTR 中CComB
11、STR bstr3(5, OLESTR(Hello World;CComBSTR bstr4(5, Hello World;CComBSTR bstr5(OLESTR(Hey there;CComBSTR bstr6(Hey there;CComBSTR bstr7(bstr6;/ 構(gòu)造時復(fù)制,內(nèi)容為 Hey there_bstr_t是是 C+對 BSTR 的封裝, 它的構(gòu)造和析構(gòu)函數(shù)分別調(diào)用 SysAllocString 和 SysFreeString 函數(shù), 其他操作是借用 BSTR API函數(shù)。 與 _variant_t相似, 使用時也要添加 comutil.h 和 comsupp.li
12、b 。五、 BSTR 、 char*和 CString 轉(zhuǎn)換(1 char*轉(zhuǎn)換成 CString若將 char*轉(zhuǎn)換成 CString ,除了直接賦值外,還可使用 CString:Format進行。例如:char chArray = This is a test;char * p = This is a test;或LPSTR p = This is a test;或在已定義 Unicode 應(yīng)的用程序中TCHAR * p = _T(This is a test;或LPTSTR p = _T(This is a test;CString theString = chArray;theStri
13、ng.Format(_T(%s, chArray;theString = p;(2 CString轉(zhuǎn)換成 char*若將 CString 類轉(zhuǎn)換成 char*(LPSTR類型,常常使用下列三種方法:方法一,使用強制轉(zhuǎn)換。例如: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, t
14、heString;需要說明的是, strcpy(或可移值 Unicode/MBCS的 _tcscpy的第二個參數(shù)是 const wchar_t* (Unicode或 const char* (ANSI,系統(tǒng)編譯器將會自動對其進行轉(zhuǎn)換。方法三,使用 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轉(zhuǎn)換成 cha
15、r*方法一,使用 ConvertBSTRToString 。例如:#include#pragma comment(lib, comsupp.libint _tmain(int argc, _TCHAR* argvBSTR bstrText = :SysAllocString(LTest;char* lpszText2 = _com_util:ConvertBSTRToString(bstrText; SysFreeString(bstrText; / 用完釋放delete lpszText2;return 0;方法二,使用 _bstr_t的賦值運算符重載。例如:_bstr_t b = bstr
16、Text;char* lpszText2 = b;(4 char*轉(zhuǎn)換成 BSTR方法一,使用 SysAllocString 等 API 函數(shù)。例如:BSTR bstrText = :SysAllocString(LTest;BSTR bstrText = :SysAllocStringLen(LTest,4;BSTR bstrText = :SysAllocStringByteLen(Test,4;方法二,使用 COleVariant 或 _variant_t。例如:/COleVariant strVar(This is a test;_variant_t strVar(This is a
17、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; 方法五,使用 ConvertStringToBSTR。例如: char* lpszText = Test; BSTR bstrText = _com
18、_util:ConvertStringToBSTR(lpszText; (5 CString 轉(zhuǎn)換成 BSTR 通常是通過使用 CStringT:AllocSysString 來實現(xiàn)。例如: CString str(This is a test; BSTR bstrText = str.AllocSysString(; SysFreeString(bstrText; / 用完釋放 (6 BSTR 轉(zhuǎn)換成 CString 一般可按下列方法進行: BSTR bstrText = :SysAllocString(LTest; CStringA str; str.Empty(; str = bstrText; 或 CStringA str(bstrText; (7 ANSI、Unicode 和寬字符之間的轉(zhuǎn)換 方法一, 使用 MultiByteToWideChar 將 ANSI 字符轉(zhuǎn)換成 Unicode 字符, 使用 WideCharToMultiByte 將 Unicode 字符轉(zhuǎn)換成 ANS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙教版數(shù)學(xué)七年級下冊《3.5 整式的化簡》聽評課記錄1
- 湘教版地理八年級下冊《第一節(jié) 北京市的城市特征與建設(shè)成就》1課時聽課評課記錄
- 八年級道德與法治下冊第二單元理解權(quán)利義務(wù)第四課公民義務(wù)第1框公民基本義務(wù)聽課評課記錄(新人教版)
- 湘教版數(shù)學(xué)九年級上冊第一章《反比例函數(shù)》復(fù)習聽評課記錄
- 人教部編版九年級歷史上冊:第15課 探尋新航路 聽課評課記錄
- 蘇科版七年級數(shù)學(xué)上冊《3.4.2合并同類項》聽評課記錄
- 通??谛W(xué)一年級口算測試卷
- 蘇教版四年級數(shù)學(xué)下冊期末復(fù)習口算練習題一
- 月業(yè)務(wù)經(jīng)理聘用協(xié)議書范本
- 二手房房屋買賣協(xié)議書范本
- 湖北中煙工業(yè)限責任公司2025年招聘(技術(shù)類和業(yè)務(wù)類崗位)【43人】高頻重點提升(共500題)附帶答案詳解
- 石家莊市長安區(qū)學(xué)年三年級數(shù)學(xué)第一學(xué)期期末檢測試題含解析
- 2025年中國一汽招聘筆試參考題庫含答案解析
- 特殊家長課后溝通技巧培訓(xùn)
- 【MOOC】數(shù)字攝影技術(shù)與藝術(shù)-西南石油大學(xué) 中國大學(xué)慕課MOOC答案
- 心內(nèi)科心衰一病一品護理成果匯報
- 2025檢驗檢測中心年度工作總結(jié)及工作計劃
- 2024年總經(jīng)理助理年終工作總結(jié)(3篇)
- 2024年考研英語(二)真題及參考答案
- 山西省太原市2023-2024學(xué)年高二上學(xué)期期末物理試題(含答案)
- B區(qū)地下室碳纖維加固施工方案
評論
0/150
提交評論