

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 10/10VC+常用數(shù)據(jù)類型與操作詳細(xì)講解 VC+常用數(shù)據(jù)類型及其操作詳解 目錄 一、VC常用數(shù)據(jù)類型列表 二、常用數(shù)據(jù)類型轉(zhuǎn)化 2.1數(shù)學(xué)類型變量與字符串相互轉(zhuǎn)換 2.2 CString及string,char *與其他數(shù)據(jù)類型的轉(zhuǎn)換和操作 CString,string,char*的綜合比較 數(shù)學(xué)類型與CString相互轉(zhuǎn)化 CString與char*相互轉(zhuǎn)換舉例 CString 與 BSTR 型轉(zhuǎn)換 VARIANT 型轉(zhuǎn)化成 CString 型 2.3 BSTR、_bstr_t與CComBSTR 2.4 VARIANT 、_variant_t 與 COleVariant 附錄CStrin
2、g及字符串轉(zhuǎn)及操作詳解 參考書籍:CSDN, 一、VC常用數(shù)據(jù)類型列表 說明: (1)表示省略 (2)1Byte=8Bit, 字與機(jī)器有關(guān),在8位系統(tǒng)中:字=1字節(jié),16位系統(tǒng)中,1字=2字節(jié),32位中:1字=4字節(jié), 64位中1字=8字節(jié).不要搞混這些概念. 二常用數(shù)據(jù)類型轉(zhuǎn)化及操作 21 數(shù)學(xué)類型變量與字符串相互轉(zhuǎn)換(這些函數(shù)都在STDLIB.H里) (1)將數(shù)學(xué)類型轉(zhuǎn)換為字符串可以用以下一些函數(shù): 舉例: _CRTIMP char * _cdecl _itoa(int, char *, int);/這是一個(gè)將數(shù)字轉(zhuǎn)換為一個(gè)字符串類型的函數(shù),最后一個(gè)int表示轉(zhuǎn)換的進(jìn)制 如以下程序: in
3、t iTyep=3; char *szChar; itoa(iType,szChar,2); cout寫的很詳細(xì),請(qǐng)大家在仔細(xì)閱讀他的文章. 地址: http:/./doc/60155b4eab00b52acfc789eb172ded630a1c9835.html /joise/ 或參考附錄: (2)轉(zhuǎn)換: 數(shù)學(xué)類型與CString相互轉(zhuǎn)化 數(shù)學(xué)類型轉(zhuǎn)化為CString 可用Format函數(shù),舉例: CString s; int i = 64; s.Format(%d, i) CString轉(zhuǎn)換為數(shù)學(xué)類型:舉例CString strValue(1.234); double dblValue;
4、dblValue = atof(LPCTSTR)strValue); CString與char*相互轉(zhuǎn)換舉例 CString strValue(“Hello”); char *szValue; szValue=strValue.GetBuffer(szValue); 也可用(LPSTR)(LPCTSTR)對(duì)CString/ 進(jìn)行強(qiáng)制轉(zhuǎn)換. szValue=(LPSTR)(LPCTSTR)strValue; 反過來可直接賦值: char *szChar=NULL; CString strValue; szChar=new char10; memset(szChar,0,10); strcpy(s
5、zChar,”Hello”); strValue=szChar; CString 與 BSTR 型轉(zhuǎn)換 CString 型轉(zhuǎn)化成 BSTR 型 當(dāng)我們使用 ActiveX 控件編程時(shí),經(jīng)常需要用到將某個(gè)值表示成 BSTR 類型.BSTR 是一種記數(shù)字符串,Intel平臺(tái)上的寬字符串(Unicode),并且可以包含嵌入的 NULL 字符。 可以調(diào)用 CString 對(duì)象的 AllocSysString 方法將 CString 轉(zhuǎn)化成 BSTR: CString str; str = ; / whatever BSTR bStr = str.AllocSysString(); BSTR型轉(zhuǎn)換為CS
6、tring 如果你在 UNICODE 模式下編譯代碼,你可以簡(jiǎn)單地寫成: CString convert(BSTR bStr) if(bStr = NULL) return CString(_T(); CString s(bStr); / in UNICODE mode return s; 如果是 ANSI 模式 CString convert(BSTR b) CString s; if(b = NULL) return s; / empty for NULL BSTR #ifdef UNICODE s = b; #else LPSTR p = s.GetBuffer(SysStringLen
7、(b) + 1); :WideCharToMultiByte(CP_ACP, / ANSI Code Page 0, / no flags b, / source widechar string -1, / assume NUL-terminated p, / target buffer SysStringLen(b)+1, / target buffer length NULL, / use system default char NULL); / dont care if default used s.ReleaseBuffer(); #endif return s; VARIANT 型轉(zhuǎn)
8、化成 CString 型 VARIANT 類型經(jīng)常用來給 COM 對(duì)象傳遞參數(shù),或者接收從 COM 對(duì)象返回的值。你也能自己編寫返回 VARIANT 類型的方法,函數(shù)返回什么類型依賴可能(并且常常)方法的輸入?yún)?shù)(比如,在自動(dòng)化操作中,依賴與你調(diào)用哪個(gè)方法。IDispatch:Invoke 可能返回(通過其一個(gè)參數(shù))一個(gè)包含有BYTE、WORD、float、double、date、BSTR 等等 VARIANT 類型的結(jié)果,(詳見 MSDN 上的 VARIANT 結(jié)構(gòu)的定義)。在下面的例子中,假設(shè)類型是一個(gè)BSTR的變體,也就是說在串中的值是通過 bsrtVal 來引用,其優(yōu)點(diǎn)是在 ANSI
9、應(yīng)用中,有一個(gè)構(gòu)造函數(shù)會(huì)把 LPCWCHAR 引用的值轉(zhuǎn)換為一個(gè) CString(見 BSTR-to-CString 部分)。在 Unicode 模式中,將成為標(biāo)準(zhǔn)的 CString 構(gòu)造函數(shù),參見對(duì)缺 省:WideCharToMultiByte 轉(zhuǎn)換的告誡,以及你覺得是否可以接受(大多數(shù)情況下,你會(huì)滿意的)。VARIANT vaData; vaData = m_com.YourMethodHere(); ASSERT(vaData.vt = VT_BSTR); CString strData(vaData.bstrVal); 你還可以根據(jù) vt 域的不同來建立更通用的轉(zhuǎn)換例程。為此你可能會(huì)考
10、慮: CString VariantToString(VARIANT * va) CString s; switch(va-vt) /* vt */ case VT_BSTR: return CString(vaData-bstrVal); case VT_BSTR | VT_BYREF: return CString(*vaData-pbstrVal); case VT_I4: s.Format(_T(%d), va-lVal); return s; case VT_I4 | VT_BYREF: s.Format(_T(%d), *va-plVal); case VT_R8: s.Forma
11、t(_T(%f), va-dblVal); return s; . 剩下的類型轉(zhuǎn)換由讀者自己完成 default: ASSERT(FALSE); / unknown VARIANT type (this ASSERT is optional) return CString(); /* vt */ 23 BSTR、_bstr_t與CComBSTR CComBSTR、_bstr_t是對(duì)BSTR的封裝,BSTR是指向字符串的32位指針。 char *轉(zhuǎn)換到BSTR可以這樣: BSTR b=_com_util:ConvertStringToBSTR(數(shù)據(jù));/使用前需要加上頭文件comutil.h 反
12、之可以使用char *p=_com_util:ConvertBSTRToString(b); 24(引)VARIANT 、_variant_t 與 COleVariant VARIANT的結(jié)構(gòu)可以參考頭文件VC98IncludeOAIDL.H中關(guān)于結(jié)構(gòu)體tagVARIANT的定義。 對(duì)于VARIANT變量的賦值:首先給vt成員賦值,指明數(shù)據(jù)類型,再對(duì)聯(lián)合結(jié)構(gòu)中相同數(shù)據(jù)類型的變量賦值,舉個(gè)例子: VARIANT va; int a=2001; va.vt=VT_I4;/指明整型數(shù)據(jù) va.lVal=a; /賦值 對(duì)于不馬上賦值的VARIANT,最好先用Void VariantInit(VARIA
13、NTARG FAR* pvarg);進(jìn)行初始化,其本質(zhì)是將vt設(shè)置為VT_EMPTY,下表我們列舉vt與常用數(shù)據(jù)的對(duì)應(yīng)關(guān)系: unsigned char bVal; VT_UI1 short iVal; VT_I2 long lVal; VT_I4 float fltVal; VT_R4 double dblVal; VT_R8 VARIANT_BOOL boolVal; VT_BOOL SCODE scode; VT_ERROR CY cyVal; VT_CY DATE date; VT_DATE BSTR bstrVal; VT_BSTR IUnknown FAR* punkVal; VT
14、_UNKNOWN IDispatch FAR* pdispVal; VT_DISPATCH SAFEARRAY FAR* parray; VT_ARRAY|* unsigned char FAR* pbVal; VT_BYREF|VT_UI1 short FAR* piVal; VT_BYREF|VT_I2 long FAR* plVal; VT_BYREF|VT_I4 float FAR* pfltVal; VT_BYREF|VT_R4 double FAR* pdblVal; VT_BYREF|VT_R8 VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BO
15、OL SCODE FAR* pscode; VT_BYREF|VT_ERROR CY FAR* pcyVal; VT_BYREF|VT_CY DATE FAR* pdate; VT_BYREF|VT_DATE BSTR FAR* pbstrVal; VT_BYREF|VT_BSTR IUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWN IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH SAFEARRAY FAR* FAR* pparray; VT_ARRAY|* VARIANT FAR* pvar
16、Val; VT_BYREF|VT_VARIANT void FAR* byref; VT_BYREF _variant_t是VARIANT的封裝類,其賦值可以使用強(qiáng)制類型轉(zhuǎn)換,其構(gòu)造函數(shù)會(huì)自動(dòng)處理這些數(shù)據(jù)類型。 例如: long l=222; ing i=100; _variant_t lVal(l); lVal = (long)i; COleVariant的使用與_variant_t的方法基本一樣,請(qǐng)參考如下例子: COleVariant v3 = 字符串, v4 = (long)1999; CString str =(BSTR)v3.pbstrVal; long i = v4.lVal;
17、VC+.NET中字符串之間的轉(zhuǎn)換 一、BSTR、LPSTR和LPWSTR 在Visual C+.NET的所有編程方式中,我們常常要用到這樣的一些基本字符串類型,如BSTR、LPSTR 和LPWSTR等。之所以出現(xiàn)類似上述的這些數(shù)據(jù)類型,是因?yàn)椴煌幊陶Z言之間的數(shù)據(jù)交換以及對(duì)ANSI、Unicode和多字節(jié)字符集(MBCS)的支持。 那么什么是BSTR、LPSTR以及LPWSTR呢? BSTR(Basic STRing,Basic字符串)是一個(gè)OLECHAR*類型的Unicode字符串。它被描述成一個(gè)與自 動(dòng)化相兼容的類型。由于操作系統(tǒng)提供相應(yīng)的 API函數(shù)(如SysAllocString)來管
18、理它以及一些默認(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ù)類型。LPSTR被定義成是一個(gè)指向以NULL(0)結(jié)尾的8位ANSI 字符數(shù)組指針,而LPWSTR是一個(gè)指向以NULL結(jié)尾的16位雙字節(jié)字符數(shù)組指針。在VC+中,還有類似的字符串類型,如LPTSTR、 LPCTSTR等,它們的含義如圖2所示。 例如,LPCTSTR是指“l(fā)ong pointer to
19、 a constant generic string”,表示“一個(gè)指向一般字符串常量的長(zhǎng)指針類型”,與C/C+的const char*相映射,而LPTSTR映射為 char*。 一般地,還有下列類型定義: #ifdef UNICODE typedef LPWSTR LPTSTR; typedef LPCWSTR LPCTSTR; #else typedef LPSTR LPTSTR; typedef LPCSTR LPCTSTR; #endif 二、CString、CStringA 和 CStringW Visual C+.NET中將CStringT作為ATL和MFC的共享的“一般”字符串類,
20、它有CString、CStringA 和CStringW三種形式,分別操作不同字符類型的字符串。這些字符類型是TCHAR、char和wchar_t。TCHAR在Unicode平臺(tái)中等同于WCHAR(16位 Unicode字符),在ANSI中等價(jià)于char。wchar_t通常定義為unsigned short。由于CString在MFC應(yīng)用程序中經(jīng)常用到,這里不再重復(fù)。 三、VARIANT、COleVariant 和_variant_t 在OLE、ActiveX和COM中,VARIANT數(shù)據(jù)類型提供了一種非常有效的機(jī)制,由于它既包含了數(shù)據(jù)本身,也包含了數(shù)據(jù)的類型,因而它可以實(shí)現(xiàn)各種不同的自動(dòng)化數(shù)
21、據(jù)的傳輸。下面讓我們來看看OAIDL.H 文件中VARIANT定義的一個(gè)簡(jiǎn)化版: struct tagVARIANT VARTYPE vt; union short iVal; / VT_I2. long lVal; / VT_I4. float fltVal; / VT_R4. double dblVal; / 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_B
22、YREF|VT_R4. double * pdblVal; / VT_BYREF|VT_R8. DATE * pdate; / VT_BYREF|VT_DATE. BSTR * pbstrVal; / VT_BYREF|VT_BSTR. ; ; 顯然,VARIANT類型是一個(gè)C結(jié)構(gòu),它包含了一個(gè)類型成員vt、一些保留字節(jié)以及一個(gè)大的union 類型。例如,如果vt為VT_I2,那么我們可以從iVal中讀出VARIANT的值。同樣,當(dāng)給一個(gè)VARIANT 變量賦值時(shí),也要先指明其類型。例如: VARIANT va; : VariantInit( / 初始化 int a = 2002; va.vt
23、 = VT_I4; / 指明long數(shù)據(jù)類型 va.lVal = a; / 賦值 為了方便處理VARIANT類型的變量,Windows還提供了這樣一些非常有用的函數(shù): VariantInit 將變量初始化為VT_EMPTY; VariantClear 消除并初始化VARIANT; VariantChangeType 改變VARIANT的類型; VariantCopy 釋放與目標(biāo)VARIANT相連的內(nèi)存并復(fù)制源VARIANT。 COleVariant類是對(duì)VARIANT結(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)類型調(diào)用
24、相應(yīng)的構(gòu)造函數(shù),并使用VariantCopy 進(jìn)行轉(zhuǎn)換賦值操作,當(dāng)VARIANT對(duì)象不在有效范圍時(shí),它的析構(gòu)函數(shù)就會(huì)被自動(dòng)調(diào)用,由于析構(gòu)函數(shù)調(diào)用了VariantClear,因而相應(yīng)的內(nèi)存就會(huì)被自動(dòng)清除。除此之外,COleVariant的賦值操作符在與VARIANT類型轉(zhuǎn)換中為我們提供極大的方便。例如下面的代碼: COleVariant v1(This is a test); / 直接構(gòu)造 COleVariant v2 = This is a test; / 結(jié)果是VT_BSTR類型,值為This is a test COleVariant v3(long)2002); COleVariant
25、v4 = (long)2002; / 結(jié)果是VT_I4類型,值為2002 _variant_t是一個(gè)用于COM的VARIANT類,它的功能與COleVariant相似。不過在Visual C+.NET 的MFC應(yīng)用程序中使用時(shí)需要在代碼文件前面添加下列兩句: #include comutil.h #pragma comment( lib, comsupp.lib ) 四、CComBSTR和_bstr_t CComBSTR是對(duì)BSTR數(shù)據(jù)類型封裝的一個(gè)ATL類,它的操作比較方便。例如: CComBSTR bstr1; bstr1 = Bye; / 直接賦值 OLECHAR* str = OLES
26、TR(ta ta); / 長(zhǎng)度為5的寬字符 CComBSTR bstr2(wcslen(str); / 定義長(zhǎng)度為5 wcscpy(bstr2.m_str, str); / 將寬字符串復(fù)制到BSTR中 CComBSTR 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)
27、造和析構(gòu)函數(shù)分別調(diào)用SysAllocString和SysFreeString 函數(shù),其他操作是借用BSTR API函數(shù)。與_variant_t相似,使用時(shí)也要添加comutil.h和comsupp.lib。 五、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)的用程
28、序中 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轉(zhuǎn)換成char* 若將CString類轉(zhuǎn)換成char*(LPSTR)類型,常常使用下列三種方法: 方法一,使用強(qiáng)制轉(zhuǎn)換。例如: CString theString( This is a test ); LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;
29、方法二,使用strcpy。例如: CString theString( This is a test ); LPTSTR lpsz = new TCHARtheString.GetLength()+1; _tcscpy(lpsz, theString); 需要說明的是,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 ); LPTST
30、R p = s.GetBuffer(); / 在這里添加使用p的代碼 if(p != NULL) *p = _T(0); s.ReleaseBuffer(); / 使用完后及時(shí)釋放,以便能使用其它的CString成員函數(shù) (3) BSTR轉(zhuǎn)換成char* 方法一,使用ConvertBSTRToString。例如: #include #pragma comment(lib, comsupp.lib) int _tmain(int argc, _TCHAR* argv) BSTR bstrText = :SysAllocString(LTest); char* lpszText2 = _com_u
31、til:ConvertBSTRToString(bstrText); SysFreeString(bstrText); / 用完釋放 delete lpszText2; return 0; 方法二,使用_bstr_t的賦值運(yùn)算符重載。例如: _bstr_t b = bstrText; char* lpszText2 = b; (4) char*轉(zhuǎn)換成BSTR 方法一,使用SysAllocString等API函數(shù)。例如: BSTR bstrText = :SysAllocString(LTest); BSTR bstrText = :SysAllocStringLen(LTest,4); BST
32、R bstrText = :SysAllocStringByteLen(Test,4); 方法二,使用COleVariant或_variant_t。例如: /COleVariant strVar(This is a test); _variant_t strVar(This is a 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_util:ConvertStringToBSTR(lpszText); (5) CString轉(zhuǎn)換成BSTR 通常是通過
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 西安醫(yī)學(xué)高等專科學(xué)?!镀囄幕?023-2024學(xué)年第二學(xué)期期末試卷
- 廣州鐵路職業(yè)技術(shù)學(xué)院《語言學(xué)導(dǎo)論》2023-2024學(xué)年第二學(xué)期期末試卷
- 陜西電子信息職業(yè)技術(shù)學(xué)院《新媒體概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 濰坊環(huán)境工程職業(yè)學(xué)院《圖片攝影創(chuàng)作》2023-2024學(xué)年第二學(xué)期期末試卷
- 安全教育快樂廚房
- 2024年攝影燈泡項(xiàng)目資金籌措計(jì)劃書代可行性研究報(bào)告
- 危險(xiǎn)品管理培訓(xùn)
- 沙金獎(jiǎng)牌設(shè)計(jì)軟件介紹
- 2025年福建泉州經(jīng)濟(jì)技術(shù)開發(fā)區(qū)市政服務(wù)有限公司招聘筆試參考題庫含答案解析
- 2025年黑龍江哈電集團(tuán)哈爾濱電機(jī)廠有限責(zé)任公司招聘筆試參考題庫含答案解析
- 醫(yī)院消毒隔離知識(shí)培訓(xùn)
- 武裝部文職試題及答案
- 狼人殺測(cè)試題及答案
- 2025年山東省威海市威海經(jīng)濟(jì)技術(shù)開發(fā)區(qū)中考一模英語試題(含答案)
- 建筑大師林徽因知到智慧樹章節(jié)測(cè)試課后答案2024年秋濰坊工程職業(yè)學(xué)院
- 2025年臨床醫(yī)師定期考核必考復(fù)習(xí)題庫及答案(900題)
- 心肺復(fù)蘇術(shù)-cpr課件
- 人力資源外包投標(biāo)方案
- 血清學(xué)反應(yīng)PPT課件
- 長(zhǎng)沙生態(tài)動(dòng)物園詳細(xì)規(guī)劃設(shè)計(jì)文本目錄
- TB公式編程官方基礎(chǔ)教程1
評(píng)論
0/150
提交評(píng)論