版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、VC 字符串轉(zhuǎn)換所屬類(lèi)別:VC+推薦指數(shù):文檔人氣:19495本周人氣:66發(fā)布日期:2006-3-11一、 BSTR 、 LPSTR 和 LPWSTR在 Visual C+.NET的所有編程方式中, 我們常常要用到這樣的一些基本字符串類(lèi)型, 如 BSTR 、 LPSTR 和 LPWSTR 等。之所以出現(xiàn)類(lèi)似上述的這些數(shù)據(jù)類(lèi)型,是因?yàn)椴煌幊陶Z(yǔ)言之間的數(shù)據(jù)交 換以及對(duì) ANSI 、 Unicode 和多字節(jié)字符集 (MBCS的支持。那么什么是 BSTR 、 LPSTR 以及 LPWSTR 呢?BSTR(Basic STRing, Basic 字符串 是一個(gè) OLECHAR*類(lèi)型的 Unicod
2、e 字符串。 它被描述成一個(gè) 與自動(dòng)化相兼容的類(lèi)型。由于操作系統(tǒng)提供相應(yīng)的 API 函數(shù) (如 SysAllocString 來(lái)管理它以及一些默 認(rèn)的調(diào)度代碼,因此 BSTR 實(shí)際上就是一個(gè) COM 字符串,但它卻在自動(dòng)化技術(shù)以外的多種場(chǎng)合下 得到廣泛使用。圖 1描述了 BSTR 的結(jié)構(gòu),其中 DWORD 值是字符串中實(shí)際所占用的字節(jié)數(shù),且它 的值是字符串中 Unicode 字符的兩倍。LPSTR 和 LPWSTR 是 Win32和 VC+所使用的一種字符串?dāng)?shù)據(jù)類(lèi)型。 LPSTR 被定義成是一個(gè) 指向以 NULL( 0 結(jié)尾的 8位 ANSI 字符數(shù)組指針,而 LPWSTR 是一個(gè)指向以 NU
3、LL 結(jié)尾的 16位雙字節(jié)字符數(shù)組指針。在 VC+中,還有類(lèi)似的字符串類(lèi)型,如 LPTSTR 、 LPCTSTR 等,它們的 含義如圖 2所示。例如, LPCTSTR 是指“ long pointer to a constant generic string” ,表示“一個(gè)指向一般字符串常 量的長(zhǎng)指針類(lèi)型” ,與 C/C+的 const char*相映射,而 LPTSTR 映射為 char*。一般地,還有下列類(lèi)型定義:#ifdef UNICODEtypedef LPWSTR LPTSTR;typedef LPCWSTR LPCTSTR;#elsetypedef LPSTR LPTSTR;typ
4、edef LPCSTR LPCTSTR;#endif二、 CString 、 CStringA 和 CStringWVisual C+.NET中將 CStringT 作為 ATL 和 MFC 的共享的“一般”字符串類(lèi),它有 CString 、 CStringA 和 CStringW 三種形式,分別操作不同字符類(lèi)型的字符串。這些字符類(lèi)型是 TCHAR 、 char 和 wchar_t。 TCHAR 在 Unicode 平臺(tái)中等同于 WCHAR(16位 Unicode 字符 , 在 ANSI 中等價(jià)于 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ù)類(lèi)型提供了一種非常有效的機(jī)制,由于它既包含 了數(shù)據(jù)本身,也包含了數(shù)據(jù)的類(lèi)型,因而它可以實(shí)現(xiàn)各種不同的自動(dòng)化數(shù)據(jù)的傳輸。下面讓我們來(lái) 看看 OAIDL.H 文件中 V ARIANT 定義的一個(gè)簡(jiǎn)化版: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 類(lèi)型是一個(gè) C 結(jié)構(gòu),它包含了一個(gè)類(lèi)型成員 vt 、
7、一些保留字節(jié)以及一個(gè)大的 union 類(lèi)型。例如,如果 vt 為 VT_I2,那么我們可以從 iVal 中讀出 V ARIANT 的值。同樣,當(dāng)給一 個(gè) V ARIANT 變量賦值時(shí),也要先指明其類(lèi)型。例如:V ARIANT va;: VariantInit(&va; / 初始化int a = 2002;va.vt = VT_I4; / 指明 long 數(shù)據(jù)類(lèi)型va.lVal = a; / 賦值為了方便處理 V ARIANT 類(lèi)型的變量, Windows 還提供了這樣一些非常有用的函數(shù):VariantInit 將變量初始化為 VT_EMPTY;VariantClear 消除并初始化 V ARI
8、ANT;VariantChangeType 改變 V ARIANT 的類(lèi)型 ;VariantCopy 釋放與目標(biāo) V ARIANT 相連的內(nèi)存并復(fù)制源 VARIANT 。COleVariant 類(lèi)是對(duì) V ARIANT 結(jié)構(gòu)的封裝。它的構(gòu)造函數(shù)具有極為強(qiáng)大大的功能,當(dāng)對(duì)象構(gòu)造 時(shí)首先調(diào)用 VariantInit 進(jìn)行初始化,然后根據(jù)參數(shù)中的標(biāo)準(zhǔn)類(lèi)型調(diào)用相應(yīng)的構(gòu)造函數(shù),并使用 VariantCopy 進(jìn)行轉(zhuǎn)換賦值操作, 當(dāng) V ARIANT 對(duì)象不在有效范圍時(shí), 它的析構(gòu)函數(shù)就會(huì)被自動(dòng)調(diào)用, 由于析構(gòu)函數(shù)調(diào)用了 VariantClear , 因而相應(yīng)的內(nèi)存就會(huì)被自動(dòng)清除。 除此之外, COleV
9、ariant 的賦值 操作符在與 V ARIANT 類(lèi)型轉(zhuǎn)換中為我們提供極大的方便。例如下面的代碼:COleVariant v1(This is a test; / 直接構(gòu)造COleVariant v2 = This is a test;/ 結(jié)果是 VT_BSTR類(lèi)型,值為 This is a testCOleVariant v3(long2002;COleVariant v4 = (long2002;/ 結(jié)果是 VT_I4類(lèi)型,值為 2002_variant_t是一個(gè)用于 COM 的 V ARIANT 類(lèi),它的功能與 COleVariant 相似。不過(guò)在 Visual C+.NET的 MFC
10、 應(yīng)用程序中使用時(shí)需要在代碼文件前面添加下列兩句:#include comutil.h#pragma comment( lib, comsupp.lib 四、 CComBSTR 和 _bstr_tCComBSTR 是對(duì) BSTR 數(shù)據(jù)類(lèi)型封裝的一個(gè) ATL 類(lèi),它的操作比較方便。例如:CComBSTR bstr1;bstr1 = Bye; / 直接賦值OLECHAR* str = OLESTR(ta ta; / 長(zhǎng)度為 5的寬字符CComBSTR bstr2(wcslen(str; / 定義長(zhǎng)度為 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)造時(shí)復(fù)制,內(nèi)容為 Hey there_bstr_t是是 C+對(duì) BSTR 的封裝, 它的構(gòu)造和析構(gòu)函數(shù)分別調(diào)用 SysAllocString 和 SysFreeString 函數(shù), 其他操作是借用 BSTR API函數(shù)。 與 _variant_t相似, 使用時(shí)也要添加 comutil.h 和 comsupp.li
12、b 。五、 BSTR 、 char*和 CString 轉(zhuǎn)換(1 char*轉(zhuǎn)換成 CString若將 char*轉(zhuǎn)換成 CString ,除了直接賦值外,還可使用 CString:Format進(jìn)行。例如: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 類(lèi)轉(zhuǎn)換成 char*(LPSTR類(lèi)型,常常使用下列三種方法:方法一,使用強(qiáng)制轉(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;需要說(shuō)明的是, strcpy(或可移值 Unicode/MBCS的 _tcscpy的第二個(gè)參數(shù)是 const wchar_t* (Unicode或 const char* (ANSI,系統(tǒng)編譯器將會(huì)自動(dòng)對(duì)其進(jìn)行轉(zhuǎn)換。方法三,使用 CString:GetBuffer。例如:CString s(_T(This is a test ;LPTSTR p = s.GetBuffer(;/ 在這里添加使用 p 的代碼if(p != NULL *p = _T(0;s.ReleaseBuffer(;/ 使用完后及時(shí)釋放,以便能使用其它的 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的賦值運(yùn)算符重載。例如:_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,這是一種最簡(jiǎn)單的方法。例如: 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 通常是通過(guò)使用 CStringT:AllocSysString 來(lái)實(shí)現(xiàn)。例如: CString str(This is a test; BSTR bstrText = str.AllocSysString(; SysFreeString(bstrText; / 用完釋放 (6 BSTR 轉(zhuǎn)換成 CString 一般可按下列方法進(jìn)行: 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度儲(chǔ)煤場(chǎng)煤炭交易代理服務(wù)合同3篇
- 2025年度金融機(jī)構(gòu)外匯借款合同綠色金融創(chuàng)新實(shí)踐
- 二零二五年度碼頭租賃項(xiàng)目環(huán)保驗(yàn)收及服務(wù)合同4篇
- 二零二五年度錄音系統(tǒng)定制開(kāi)發(fā)與實(shí)施合同3篇
- 2025年度蘋(píng)果水果產(chǎn)地直供直銷(xiāo)采購(gòu)合同4篇
- 2025版木工模板租賃與園林景觀(guān)設(shè)計(jì)施工承包合同范本3篇
- 二零二五年度寵物醫(yī)院寵物食品研發(fā)與生產(chǎn)合作協(xié)議3篇
- 二零二五年度辦公家具銷(xiāo)售合同(含安裝)2篇
- 二零二五年度天使投資協(xié)議書(shū):生物科技研發(fā)項(xiàng)目風(fēng)險(xiǎn)投資合同
- 二零二五年度商標(biāo)授權(quán)及商標(biāo)市場(chǎng)推廣合同范本2篇
- 2024-2030年中國(guó)招標(biāo)代理行業(yè)深度分析及發(fā)展前景與發(fā)展戰(zhàn)略研究報(bào)告
- 醫(yī)師定期考核 (公共衛(wèi)生)試題庫(kù)500題(含答案)
- 基因突變和基因重組(第1課時(shí))高一下學(xué)期生物人教版(2019)必修2
- 內(nèi)科學(xué)(醫(yī)學(xué)高級(jí)):風(fēng)濕性疾病試題及答案(強(qiáng)化練習(xí))
- 音樂(lè)劇好看智慧樹(shù)知到期末考試答案2024年
- 辦公設(shè)備(電腦、一體機(jī)、投影機(jī)等)采購(gòu) 投標(biāo)方案(技術(shù)方案)
- 案卷評(píng)查培訓(xùn)課件模板
- 2024年江蘇省樣卷五年級(jí)數(shù)學(xué)上冊(cè)期末試卷及答案
- 人教版初中英語(yǔ)七八九全部單詞(打印版)
- 波浪理論要點(diǎn)圖解完美版
- 金融交易數(shù)據(jù)分析與風(fēng)險(xiǎn)評(píng)估項(xiàng)目環(huán)境敏感性分析
評(píng)論
0/150
提交評(píng)論