VC常用數(shù)據(jù)類型使用轉(zhuǎn)換詳解_第1頁
VC常用數(shù)據(jù)類型使用轉(zhuǎn)換詳解_第2頁
VC常用數(shù)據(jù)類型使用轉(zhuǎn)換詳解_第3頁
VC常用數(shù)據(jù)類型使用轉(zhuǎn)換詳解_第4頁
VC常用數(shù)據(jù)類型使用轉(zhuǎn)換詳解_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

vc++中各種字符串(轉(zhuǎn)載)2007年09月08日星期六下午05:27CString,BSTR,LPCTSTR之間關(guān)系和區(qū)別CString是一個動態(tài)TCHAR數(shù)組,BSTR是一種專有格式的字符串(需要用系統(tǒng)提供的函數(shù)來操縱,LPCTSTR只是一個常量的TCHAR指針。CString是一個完全獨立的類,動態(tài)的TCHAR數(shù)組,封裝了+等操作符和字符串操作方法。typedefOLECHARFAR*BSTR;typedefconstchar*LPCTSTR;vc++中各種字符串的表示法首先char*是指向ANSI字符數(shù)組的指針,其中每個字符占據(jù)8位(有效數(shù)據(jù)是除掉最高位的其他7位),這里保持了與傳統(tǒng)的C,C++的兼容。LP的含義是長指針(longpointer)oLPSTR是一個指向以‘\0’結(jié)尾的ANSI字符數(shù)組的指針,與char*可以互換使用,在Win32中較多地使用LPSTR。而LPCSTR中增加的‘C’的含義是“CONSTANT"(常量),表明這種數(shù)據(jù)類型的實例不能被使用它的API函數(shù)改變,除此之外,它與LPSTR是等同的。LP表示長指針,在win16下有長指針(LP)和短指針(P)的區(qū)別,而在Win32下是沒有區(qū)別的,都是32位.所以這里的LP和P是等價的.C表示constT是什么東西呢,我們知道TCHAR在采用Unicode方式編譯時是wchar_t,在普通時編譯成char.為了滿足程序代碼國際化的需要,業(yè)界推出了Unicode標(biāo)準(zhǔn),它提供了一種簡單和一致的表達(dá)字符串的方法,所有字符中的字節(jié)都是16位的值,其數(shù)量也可以滿足差不多世界上所有書面語言字符的編碼需求,開發(fā)程序時使用Unicode(類型為wchar_t)是一種被鼓勵的做法。LPWSTR與LPCWSTR由此產(chǎn)生,它們的含義類似于LPSTR與LPCSTR,只是字符數(shù)據(jù)是16位的wchar_t而不是char。然后為了實現(xiàn)兩種編碼的通用,提出了TCHAR的定義:如果定義—UNICODE,聲明如下:typedefwchar_tTCHAR;如果沒有定義_UNICODE,則聲明如下:typedefcharTCHAR;LPTSTR和LPCTSTR中的含義就是每個字符是這樣的TCHAR。CString類中的字符就是被聲明為TCHAR類型的,它提供了一個封裝好的類供用戶方便地使用。LPCTSTR:#ifdef_UNICODEtypedefconstwchar_t*LPCTSTR;#elsetypedefconstchar*LPCTSTR;#endifVC常用數(shù)據(jù)類型使用轉(zhuǎn)換詳解先定義一些常見類型變量借以說明inti=100;longl=2001;floatf=300.2;doubled=12345.119;charusername□二〃女俠程佩君〃;chartemp[200];char*buf;CStringstr;_variant_tv1;_bstr_tv2;一、 其它數(shù)據(jù)類型轉(zhuǎn)換為字符串短整型(int)itoa(i,temp,10); 〃將i轉(zhuǎn)換為字符串放入temp中,最后一個數(shù)字表示十進制itoa(i,temp,2); //按二進制方式轉(zhuǎn)換長整型(long)ltoa(l,temp,10);二、 從其它包含字符串的變量中獲取指向該字符串的指針CString變量str="2008北京奧運〃;buf=(LPSTR)(LPCTSTR)str;BSTR類型的_variant_t變量v1=(_bstr_t)"程序員";buf=_com_util::ConvertBSTRToString((_bstr_t)v1);三、 字符串轉(zhuǎn)換為其它數(shù)據(jù)類型strcpy(temp,"123");短整型(int)i=atoi(temp);長整型(long)l=atol(temp);浮點(double)d=atof(temp);四、 其它數(shù)據(jù)類型轉(zhuǎn)換到CString使用CString的成員函數(shù)Format來轉(zhuǎn)換,例如:整數(shù)(int)str.Format("%d",i);浮點數(shù)(float)str.Format("%f",i);字符串指針(char*)等已經(jīng)被CString構(gòu)造函數(shù)支持的數(shù)據(jù)類型可以直接賦值str=username;五、 BSTR、_bstr_t與CComBSTRCComBSTR、_bstr_t是對BSTR的封裝,BSTR是指向字符串的32位指針。char*轉(zhuǎn)換到BSTR可以這樣:BSTRb=_com_util::ConvertStringToBSTR("數(shù)據(jù)"); //使用前需要加上頭文件comutil.h反之可以使用char*p=_com_util::ConvertBSTRToString(b);六、VARIANT、_variant_t與COleVariantVARIANT的結(jié)構(gòu)可以參考頭文件VC98\Include\OAIDL.H中關(guān)于結(jié)構(gòu)體tagVARIANT的定義。對于VARIANT變量的賦值:首先給vt成員賦值,指明數(shù)據(jù)類型,再對聯(lián)合結(jié)構(gòu)中相同數(shù)據(jù)類型的變量賦值,舉個例子:VARIANTva;inta=2001;va.vt=VT_I4; //指明整型數(shù)據(jù)va.lVal=a; //賦值對于不馬上賦值的VARIANT,最好先用VoidVariantInit(VARIANTARGFAR*pvarg);進行初始化,其本質(zhì)是將vt設(shè)置為VT_EMPTY,下表我們列舉vt與常用數(shù)據(jù)的對應(yīng)關(guān)系:unsignedcharbVal;VT_UI1shortiVal;VT_I2longlVal;VT_I4floatfltVal;VT_R4doubledblVal;VT_R8VARIANT_BOOLboolVal;VT_BOOLSCODEscode; VT_ERRORCYcyVal;VT_CYDATEdate;VT_DATEBSTRbstrVal;VT_BSTRIUnknownFAR*punkVal; VT_UNKNOWNIDispatchFAR*pdispVal;VT_DISPATCHSAFEARRAYFAR*parray; VT_ARRAY|*unsignedcharFAR*pbVal;VT_BYREF|VT_UI1shortFAR*piVal;VT_BYREF|VT_I2longFAR*plVal;VT_BYREF|VT_I4floatFAR*pfltVal;VT_BYREf|vT_R4doubleFAR*pdblVal;VT_BYREF|VT_R8VARIANT_BOOLFAR*pboolVal;VT_BYREF|VT_BOOLSCODEFAR*pscode;VT_BYREF|VT_ERRORCYFAR*pcyVal;VT_BYREF|VT_CYDATEFAR*pdate;VT_BYREF|VT_DATEBSTRFAR*pbstrVal;VT_BYREF|VT_BSTRIUnknownFAR*FAR*ppunkVal; VT_BYREF|VT_UNKNOWNIDispatchFAR*FAR*ppdispVal;VT_BYREF|VT_DISPATCHSAFEARRAYFAR*FAR*pparray; VT_ARRAY|*VARIANTFAR*pvarVal;VT_BYREF|VT_VARIANTvoidFAR*byref;VT_BYREF_variant_t是VARIANT的封裝類,其賦值可以使用強制類型轉(zhuǎn)換,其構(gòu)造函數(shù)會自動處理這些數(shù)據(jù)類型。例如:longl=222;ingi=100;_variant_tlVal(l);lVal=(long)i;COleVariant的使用與_variant_t的方法基本一樣,請參考如下例子:COleVariantv3=〃字符串〃,v4=(long)1999;CStringstr=(BSTR)v3.pbstrVal;longi=v4.lVal;七、其它對消息的處理中我們經(jīng)常需要將WPARAM或LPARAM等32位數(shù)據(jù)(DWORD)分解成兩個16位數(shù)據(jù)(WORD),例如:LPARAMlParam;WORDloValue=LOWORD(lParam); 〃取低16位WORDhiValue=HIWORD(lParam); 〃取高16位對于16位的數(shù)據(jù)(WORD)我們可以用同樣的方法分解成高低兩個8位數(shù)據(jù)(BYTE),例如:WORDwValue;BYTEloValue=LOBYTE(wValue); 〃取低8位BYTEhiValue=HIBYTE(wValue); 〃取高8位如何將CString類型的變量賦給char*類型的變量1、 GetBuffer函數(shù):使用CString::GetBuffer函數(shù)。char*p;CStringstr="hello”;p=str.GetBuffer(str.GetLength());str.ReleaseBuffer();將CString轉(zhuǎn)換成char*時CStringstr("aaaaaaa");strcpy(str.GetBuffer(10),"aa");str.ReleaseBuffer();當(dāng)我們需要字符數(shù)組時調(diào)用GetBuffer(intn),其中n為我們需要的字符數(shù)組的長度.使用完成后一定要馬上調(diào)用ReleaseBuffer();還有很重要的一點就是,在能使用constchar*的地方,就不要使用char*2、 memcpy:CStringmCS=_T("cxl");charmch[20];memcpy(mch,mCS,20);3、 用LPCTSTR強制轉(zhuǎn)換:盡量不使用char*ch;CStringstr;ch=(LPSTR)(LPCTSTR)str;CStringstr="good";char*tmp;sprintf(tmp,"%s”,(LPTSTR)(LPCTSTR)str);4、CStringMsg;Msg=Msg+"abc";LPTSTRlpsz;lpsz=newTCHAR[Msg.GetLength()+1];_tcscpy(lpsz,Msg);char*psz;strcpy(psz,lpsz);CString類向constchar*轉(zhuǎn)換chara[100];CStringstr("aaaaaa");strncpy(a,(LPCTSTR)str,sizeof(a));或者如下:strncpy(a,str,sizeof(a));以上兩種用法都是正確地.因為strncpy的第二個參數(shù)類型為constchar*.所以編譯器會自動將CString類轉(zhuǎn)換成constchar*.CString轉(zhuǎn)LPCTSTR(constchar*)CStringcStr;constchar*lpctStr=(LPCTSTR)cStr;LPCTSTR轉(zhuǎn)CStringLPCTSTRlpctStr;CStringcStr=lpctStr;將char*類型的變量賦給CString型的變量可以直接賦值,如:CStringmyString="Thisisatest";也可以利用構(gòu)造函數(shù),如:CStrings1("Tom");將CString類型的變量賦給char[]類型(字符串)的變量1、 sprintf()函數(shù)CStringstr="good";chartmp[200];sprintf(tmp,"%s",(LPCSTR)str);(LPCSTR)str這種強制轉(zhuǎn)換相當(dāng)于(LPTSTR)(LPCTSTR)strCString類的變量需要轉(zhuǎn)換為(char*)的時,使用(LPTSTR)(LPCTSTR)str然而,LPCTSTR是constchar*,也就是說,得到的字符串是不可寫的!將其強制轉(zhuǎn)換成LPTSTR去掉const,是極為危險的!一不留神就會完蛋!要得到char*,應(yīng)該用GetBuffer()或GetBufferSetLength(),用完后再調(diào)用ReleaseBuffer()。2、 strcpy()函數(shù)CStringstr;charc[256];strcpy(c,str);charmychar[1024];CStringsource="Hello”;strcpy((char*)&mychar,(LPCTSTR)source);關(guān)于CString的使用1、 指定CString形參對于大多數(shù)需要字符串參數(shù)的函數(shù),最好將函數(shù)原型中的形參指定為一個指向字符(LPCTSTR)而非CString的const指針。當(dāng)將形參指定為指向字符的const指針時,可將指針傳遞到TCHAR數(shù)組(如字符串["hithere"])或傳遞到CString對象。CString對象將自動轉(zhuǎn)換成LPCTSTR。任何能夠使用LPCTSTR的地方也能夠使用CString對象。2、 如果某個形參將不會被修改,則也將該參數(shù)指定為常數(shù)字符串引用(即constCString&)。如果函數(shù)要修改該字符串,則刪除const修飾符。如果需要默認(rèn)為空值,則將其初始化為空字符串[""],如下所示:voidAddCustomer(constCString&name,constCString&address,constCString&comment="");3、 對于大多數(shù)函數(shù)結(jié)果,按值返回CString對象即可。串的基本運算對于串的基本運算,很多高級語言均提供了相應(yīng)的運算符或標(biāo)準(zhǔn)的庫函數(shù)來實現(xiàn)。為敘述方便,先定義幾個相關(guān)的變量:chars1[20]="dir/bin/appl”,s2[20]="file.asm”,s3[30],*p;intresult;下面以C語言中串運算介紹串的基本運算1、 求串長intstrlen(char*s); //求串s的長度【例】printf("%d”,strlen(s1)); 〃輸出si的串長122、 串復(fù)制char*strcpy(char*to,*from);//將from串復(fù)制到to串中,并返回to開始處指針【例】strcpy(s3,s1);//s3="dir/bin/appl",s1串不變3、聯(lián)接char*strcat(char*to,char*from);//將from串復(fù)制到to串的末尾,//并返回to串開始處的指針【例】strcat(s3,"/"); //s3="dir/bin/appl/"strcat(s3,s2);//s3="dir/bin/appl/file.asm"strcat(s3,s2);4、 串比較intstrcmp(char*s1,char*s2);//比較si和s2的大小,〃當(dāng)s1<s2、si>s2和s1=s2時,分別返回小于0、大于0和等于0的值【例】result=strcmp(〃baker〃,〃Baker〃);//result>0result=strcmp(〃12〃,〃12〃); //result=0result=strcmp(〃Joe〃,〃joseph〃) //result<05、 字符定位char*strchr(char*s,charc);//找c在字符串s中第一次出現(xiàn)的位置,//若找到,則返回該位置,否則返回NULL【例】p=strchr(s2,'.'); //p指向"file”之后的位置if(p)strcpy(p,".cpp"); //s2="file.cpp”注意:上述操作是最基本的,其中后4個操作還有變種形式:strncpy,strncath和strnchr。其它的串操作見C的<string.h>。在不同的高級語言中,對串運算的種類及符號都不盡相同其余的串操作一般可由這些基本操作組合而成【例】求子串的操作可如下實現(xiàn):voidsubstr(char*sub,char*s,intpos,intlen)(//s和sub是字符數(shù)組,用sub返回串s的第pos個字符起長度為len的子串〃其中0<=pos<=strlen(s)-1,且數(shù)組sub至少可容納len+1個字符。if(pos<0||pos>strlen(s)-1||len<0)Error("parametererror!");strncpy(sub,&s[pos],len); //從s[pos]起復(fù)制至多l(xiāng)en個字符到subVC數(shù)據(jù)類型轉(zhuǎn)換大全(轉(zhuǎn)載)2009-06-0517:13inti=100;longl=2001;floatf=300.2;doubled=12345.119;charusername□二”程佩君”;chartemp[200];char*buf;CStringstr;_variant_tv1;_bstr_tv2;一、其它數(shù)據(jù)類型轉(zhuǎn)換為字符串短整型(int)itoa(i,temp,10);///將i轉(zhuǎn)換為字符串放入temp中,最后一個數(shù)字表示十進制itoa(i,temp,2);///按二進制方式轉(zhuǎn)換長整型(long)ltoa(l,temp,10);浮點數(shù)(float,double)用fcvt可以完成轉(zhuǎn)換,這是MSDN中的例子:intdecimal,sign;char*buffer;doublesource=3.1415926535;buffer=_fcvt(source,7,&decimal,&sign);運行結(jié)果:source:3.1415926535buffer:‘31415927’decimal:1sign:0decimal表示小數(shù)點的位置,sign表示符號:0為正數(shù),1為負(fù)數(shù)CString變量str=“2008北京奧運”;buf=(LPSTR)(LPCTSTR)str;〃這個因為buf是個char*變量先把CString變量轉(zhuǎn)換為constchar*類型的 再變?yōu)閏har*類型的上面的CString轉(zhuǎn)換為char*型號的必須經(jīng)過兩次 反之的直接賦值就可以BSTR變量BSTRbstrValue=::SysAllocString(L"程序員");char*buf=_com_util::ConvertBSTRToString(bstrValue);SysFreeString(bstrValue);一定注意凡是定義的指針變量一定要用delete顯示刪除AfxMessageBox(buf);delete(buf);CComBSTR變量CComBSTRbstrVar(”test”);char*buf=_com_util::ConvertBSTRToString(bstrVar.m_str);AfxMessageBox(buf);delete(buf);_bstr_t變量_bstr_t類型是對BSTR的封裝,因為已經(jīng)重載了=操作符,所以很容易使用_bstr_tbstrVar(”test”);constchar*buf=bstrVar;///不要修改buf中的內(nèi)容_bstr_t實際上是個字符指針型的AfxMessageBox(buf);通用方法(針對非COM數(shù)據(jù)類型)用sprintf完成轉(zhuǎn)換charbuffer[200];charc=‘1,;inti=35;longj=1000;floatf=1.7320534f;sprintf(buffer,"%c",c);sprintf(buffer,"%d",i);sprintf(buffer,"%d",j);sprintf(buffer,"%f",f);二、字符串轉(zhuǎn)換為其它數(shù)據(jù)類型strcpy(temp,"123'');短整型(int)i=atoi(temp);長整型(long)l=atol(temp);浮點(double)d=atof(temp);CString變量CStringname=temp;BSTR變量BSTRbstrValue=::SysAllocString(L"程序員");???///完成對bstrValue的使用SysFreeString(bstrValue);CComBSTR變量CComBSTR類型變量可以直接賦值CComBSTRbstrVar1("test");CComBSTRbstrVar2(temp);_bstr_t變量_bstr_t類型的變量可以直接賦值_bstr_tbstrVar1("test");_bstr_tbstrVar2(temp);三、 其它數(shù)據(jù)類型轉(zhuǎn)換到CString使用CString的成員函數(shù)Format來轉(zhuǎn)換,例如:整數(shù)(int)str.Format(”%d”,i);浮點數(shù)(float)str.Format(”%f”,i);字符串指針(char*)等已經(jīng)被CString構(gòu)造函數(shù)支持的數(shù)據(jù)類型可以直接賦值str=username;對于Format所不支持的數(shù)據(jù)類型,可以通過上面所說的關(guān)于其它數(shù)據(jù)類型轉(zhuǎn)化到char*的方法先轉(zhuǎn)到char*,然后賦值給CString變量。四、 BSTR、_bstr_t與CComBSTRCComBSTR是ATL對BSTR的封裝,_bstr_t是C++對BSTR的封裝,BSTR是32位指針,但并不直接指向字串的緩沖區(qū)。char*轉(zhuǎn)換到BSTR可以這樣:BSTRb=_com_util::ConvertStringToBSTR(”數(shù)據(jù)”);///使用前需要加上comutil.h和comsupp.libSysFreeString(bstrValue);反之可以使用char*p=_com_util::ConvertBSTRToString(b);deletep;具體可以參考一,二段落里的具體說明。CComBSTR與_bstr_t對大量的操作符進行了重載,可以直接進行=,!二,=二等操作,所以使用非常方便。特別是_bstr_t,建議大家使用它。五、 VARIANT、_variant_t與COleVariantVARIANT的結(jié)構(gòu)可以參考頭文件VC98\Include\OAIDL.H中關(guān)于結(jié)構(gòu)體tagVARIANT的定義。對于VARIANT變量的賦值:首先給vt成員賦值,指明數(shù)據(jù)類型,再對聯(lián)合結(jié)構(gòu)中相同數(shù)據(jù)類型的變量賦值,舉個例子:VARIANTva;inta=2001;va.vt=VT_I4;///指明整型數(shù)據(jù)va.lVal=a;///賦值對于不馬上賦值的VARIANT,最好先用VoidVariantInit(VARIANTARGFAR*pvarg);進行初始化,其本質(zhì)是將vt設(shè)置為VT_EMPTY,下表我們列舉vt與常用數(shù)據(jù)的對應(yīng)關(guān)系:BytebVal;//VT_UI1.ShortiVal;//VT_I2.longlVal;//VT_I4.floatfltVal;//VT_R4.doubledblVal;//VT_R8.VARIANT_BOOLboolVal;//VT_BOOL.SCODEscode;//VT_ERROR.CYcyVal;//VT_CY.DATEdate;//VT_DATE.BSTRbstrVal;//VT_BSTR.DECIMALFAR*pdecVal//VT_BYREF|VT_DECIMAL.IUnknownFAR*punkVal;//VT_UNKNOWN.IDispatchFAR*pdispVal;//VT_DISPATCH.SAFEARRAYFAR*parray;//VT_ARRAY|*.ByteFAR*pbVal;//VT_BYREf|vT_UI1.shortFAR*piVal;//VT_BYREF|VT_I2.longFAR*plVal;//VT_BYREF|VT_I4.floatFAR*pfltVal;//VT_BYREf|vT_R4.doubleFAR*pdblVal;//VT_BYREF|VT_R8.VARIANT_BOOLFAR*pboolVal;//VT_BYREF|VT_BOOL.SCODEFAR*pscode;//VT_BYREF|VT_ERROR.CYFAR*pcyVal;//VT_BYREF|VT_CY.DATEFAR*pdate;//VT_BYREF|VT_DATE.BSTRFAR*pbstrVal;//VT_BYREf|vT_BSTR.IUnknownFAR*FAR*ppunkVal;//VT_BYREF|VT_UNKNOWN.IDispatchFAR*FAR*ppdispVal;//VT_BYREF|VT_DISPATCH.SAFEARRAYFAR*FAR*pparray;//VT_ARRAY|*.VARIANTFAR*pvarVal;//VT_BYREF|VT_VARIANT.voidFAR*byref;//GenericByRef.charcVal;//VT_I1.unsignedshortuiVal;//VT_UI2.unsignedlongulVal;//VT_UI4.intintVal;//VT_INT.unsignedintuintVal;//VT_UINT.charFAR*pcVal;//VT_BYREF|VT_I1.unsignedshortFAR*puiVal;//VT_BYREF|VT_UI2.unsignedlongFAR*pulVal;//VT_BYREF|VT_UI4.intFAR*pintVal;//VT_BYREF|VT_INT.unsignedintFAR*puintVal;//VT_BYREF|VT_UINT._variant_t是VARIANT的封裝類,其賦值可以使用強制類型轉(zhuǎn)換,其構(gòu)造函數(shù)會自動處理這些數(shù)據(jù)類型。使用時需加上#include例如:longl=222;ingi=100;_variant_tlVal(l);lVal=(long)i;COleVariant的使用與_variant_t的方法基本一樣,請參考如下例子:COleVariantv3=“字符串”,v4=(long)1999;CStringstr=(BSTR)v3.pbstrVal;longi=v4.lVal;六、 其它一些COM數(shù)據(jù)類型根據(jù)ProgID得到CLSIDHRESULTCLSIDFromProgID(LPCOLESTRlpszProgID,LPCLSIDpclsid);CLSIDclsid;CLSIDFromProgID(L”MAPI.Folder”,&clsid);根據(jù)CLSID得到ProgIDWINOLEAPIProgIDFromCLSID(REFCLSIDclsid,LPOLESTR*lplpszProgID);例如我們已經(jīng)定義了CLSID_IApplication,下面的代碼得到ProgIDLPOLESTRpProgID=0;ProgIDFromCLSID(CLSID_IApplication,&pProgID);???///可以使用pProgIDCoTaskMemFree(pProgID);//不要忘記釋放七、 ANSI與UnicodeUnicode稱為寬字符型字串,COM里使用的都是Unicode字符串。將ANSI轉(zhuǎn)換到Unicode通過L這個宏來實現(xiàn),例如:CLSIDFromProgID(L”MAPI.Folder”,&clsid);通過MultiByteToWideChar函數(shù)實現(xiàn)轉(zhuǎn)換,例如:char*szProgID="MAPI.Folder";WCHARszWideProgID[128];CLSIDclsid;longlLen=MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));szWideProgID[lLen]=‘\0z;通過A2W宏來實現(xiàn),例如:USES_CONVERSION;CLSIDFromProgID(A2W(szProgID),&clsid);將Unicode轉(zhuǎn)換到ANSI使用WideCharToMultiByte,例如://假設(shè)已經(jīng)有了一個Unicode串wszSomeString…charszANSIString[MAX_PATH];WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wszSomeString,-1,szANSIString,sizeof(szANSIString),NULL,NULL);使用W2A宏來實現(xiàn),例如:USES_CONVERSION;pTemp=W2A(wszSomeString);八、 其它對消息的處理中我們經(jīng)常需要將WPARAM或LPARAM等32位數(shù)據(jù)(DWORD)分解成兩個16位數(shù)據(jù)(WORD),例如:LPARAMIParam;WORDloValue=LOWORD(lParam);///取低16位WORDhiValue=HIWORD(lParam);///取高16位對于16位的數(shù)據(jù)(WORD)我們可以用同樣的方法分解成高低兩個8位數(shù)據(jù)(BYTE),例如:WORDwValue;BYTEloValue=LOBYTE(wValue);///取低8位BYTEhiValue=HIBYTE(wValue);///取高8位兩個16位數(shù)據(jù)(WORD)合成32位數(shù)據(jù)(DWORD,LRESULT,LPARAM,或WPARAM)LONGMAKELONG(WORDwLow,WORDwHigh);WPARAMMAKEWPARAM(WORDwLow,WORDwHigh);LPARAMMAKELPARAM(WORDwLow,WORDwHigh);LRESULTMAKELRESULT(WORDwLow,WORDwHigh);兩個8位的數(shù)據(jù)(BYTE)合成16位的數(shù)據(jù)(WORD)WORDMAKEWORD(BYTEbLow,BYTEbHigh);從R(red),G(green),B(blue)三色得到COLORREF類型的顏色值COLORREFRGB(BYTEbyRed,BYTEbyGreen,BYTEbyBlue);例如COLORREFbkcolor=RGB(0X22,0X98,0X34);從COLORREF類型的顏色值得到RGB三個顏色值BYTERed=GetRValue(bkcolor);///得到紅顏色BYTEGreen=GetGValue(bkcolor);///得到綠顏色BYTEBlue=GetBValue(bkcolor);///得到蘭顏色九、注意事項假如需要使用到ConvertBSTRToString此類函數(shù),需要加上頭文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragmacomment(lib,"comsupp.lib")后記:本文匆匆寫成,錯誤之處在所難免,歡迎指正.關(guān)于把BSTR類型數(shù)據(jù)轉(zhuǎn)換成CString類型數(shù)據(jù)時的問題?當(dāng)我在把BSTR類型數(shù)據(jù)轉(zhuǎn)換成CString或“char*類型"數(shù)據(jù)時,發(fā)現(xiàn)在BSTR類型字符串較短的情況下沒問題,當(dāng)較長時就會出現(xiàn)內(nèi)存讀寫錯了。(在NT,2000下都測試是這樣的。)根據(jù)你所說:字符串指針(char*)等已經(jīng)被CString構(gòu)造函數(shù)支持的數(shù)據(jù)類型可以直接賦值str=username;當(dāng)b為BSTR類型時可以使用char*p=_com_util::ConvertBSTRToString(b);于是以下是對的:CStringcstr;BSTRbstr;.??.cstr=com_util::ConvertBSTRToString(bstr);可是當(dāng)bstr非常大時(其實,較大時就會)就會出現(xiàn)內(nèi)存讀寫錯,不知何故。此外我發(fā)現(xiàn)cstr=com_util::ConvertBSTRToString(bstr);可以簡化為cstr=bstr;但當(dāng)bstr較大時同樣出現(xiàn)這個問題。請兄弟幫忙!急。謝謝!如何轉(zhuǎn)化((list*)fileip.bian)->liang關(guān)于把CString轉(zhuǎn)化成LPCTSTR的問題作者:jakiesun發(fā)表日期:2001-9-520:08:48我記的我以前寫過這樣一段代碼voidfunction()(CStringstr,str1,str2;function((char*)(LPCTSTR)str1);str=str1;?//調(diào)試道此發(fā)現(xiàn)str2的值隨著str的改變而改變,請問能解釋一下為什么,如有回答,請通知wangshaoh...@,tx先}添加lib支持作者:磨刀霍霍發(fā)表日期:2001-9-1011:32:12如果不添加會產(chǎn)生錯誤,在setting中加入comsupp.lib或者直接#pragmacomment(lib,“comsupp.lib”)微軟認(rèn)為缺省的設(shè)置callconvention如果不設(shè)置成__cdecl也會出現(xiàn)同樣的錯誤。1。int轉(zhuǎn)成cstring??回復(fù)人: caigzhi(caigzhi)(2001-10-1711:27:35)得0分CString的成員函數(shù)Format()inta=2131;CStringstr;str.Format("%d”,a);回復(fù)人: tenchi(C與C++之間)(2001-10-1711:32:12)得0分inti=2001;charstr[10];_itoa(i,str,10);CStringszString=str;回復(fù)人: fiolin(幽深的水)(2001-10-1711:45:40)得0分他們兩個的都可以?。』貜?fù)人: sohucsdnvc(thanks)(2001-10-1713:24:17)得0分那如何把double轉(zhuǎn)成cstring回復(fù)人: yihugang(小虎子)(2001-10-1713:29:15)得6分inti=2131;char*c=newchar[20];CStringstr;sprintf(c,’%d’,i);str=*c;回復(fù)人: Gu_c_h(Gu)(2001-10-1714:07:17)得0分用_gcvt下面是msdn的例子Example/*_GCVT.C:Thisprogramconverts-3.1415e5*toitsstringrepresentation.*/#include#includevoidmain(void)(charbuffer[50];doublesource=-3.1415e5;_gcvt(source,7,buffer);printf(“source:%fbuffer:‘%s’\n”,source,buffer);_gcvt(source,7,buffer);printf(“source:%ebuffer:‘%s’\n”,source,buffer);}Outputsource:-314150.000000buffer:‘-314150.’source:-3.141500e+005buffer:‘-314150.’回復(fù)人: Gu_c_h(Gu)(2001-10-1714:49:56)得6分inta=-3.1415e5;CStringstr;str.Format(”%f”,a);回復(fù)人: ruixp(銳劍)(2001-10-1715:06:48)得6分CString的成員函數(shù)Format()inta=2131;CStringstr;str.Format(”%d”,a);2。基類對象怎么能轉(zhuǎn)換成派生類對象?intCDaoListView::OnCreate(LPCREATESTRUCTlpCreateStruct)(lpCreateStruct->style|=LVS_REPORT|LVS_EDITLABELS;if(CListView::OnCreate(lpCreateStruct)==-1)return-1;////////////創(chuàng)建ImageList;CDaoViewApp*pApp=(CDaoViewApp*)AfxGetApp();m_pImageList=newCImageList();ASSERT(m_pImageList!=NULL);m_pImageList->Create(16,16,TRUE,4,4);m_pImageList->Add(pApp->LoadIcon(IDI_KEY));m_pImageList->Add(pApp->LoadIcon(IDI_ICON4));m_pImageList->Add(pApp->LoadIcon(IDI_ICON5));CListCtrlEx&ctlList=(CListCtrlEx&)GetListCtrl();//我不懂的就這句,cListCtrlEx看下面的聲明。ctlList.SetlmageList(m_pImageList,LVSIL_SMALL);////////////return0;}classCListCtrlEx:publicCListCtrl//類cListCtrlEx定義。{?..}classCDaoListView:publicCListView//cDaoListView定義!(…}注:我的問題是GetListCtrl()返回的是一個cListCtrl對象的引用,怎么能把它轉(zhuǎn)換成一個它的派生類對象的引用?c++的類型轉(zhuǎn)換怎么支持?回復(fù)貼子:回復(fù)人:lhj(努力加油)(2002-1-2918:56:06)得0分CListCtrlEx&ctlList=(CListCtrlEx&)GetListCtrl();這是強制類型轉(zhuǎn)換,&表示是一個引用,lctList的值在這次賦值后不能被修改。建議你找本C++方面的書看看,VC雖然號稱可視,實際上C++基礎(chǔ)還是很重要的。用dynamic_cast()可以安全的轉(zhuǎn)換。3。 如何在CString和double之間轉(zhuǎn)換?要求轉(zhuǎn)換之后能保留小數(shù)點,保留正負(fù)號??cstring::format(%.xe)x為精度位CStringstr;doubledb;str="123.456〃;db=atof((LPCTSTR)str);CString->double:atofdouble->CString:FormatCStringstr;doubledb;str="123.456〃;db=atof((LPCTSTR)str);db=777.999;str.format("%e",db);4。 字符型要轉(zhuǎn)換成int??atoi(str)5。 _bstr_t至0unsignedint??_bstr_tstr;unsignedintLength=6;Length二Length-str.length();6。VARIANT類型轉(zhuǎn)換問題?我在使用MSCOMM中SetOutput()函數(shù)時形參必須為VARIANT變量如何將其它的數(shù)據(jù)類型轉(zhuǎn)換為VARIANT類型?如:Cstring->VARIANT、*char->VARIANT我對VARIANT的類型結(jié)構(gòu)體不太熟,請講詳細(xì)些(最好有范例),謝謝!VARIANT本身是一個復(fù)雜的結(jié)構(gòu),別的數(shù)據(jù)怎么轉(zhuǎn)呀?關(guān)注回復(fù)人: mpg_liu(星仁)(2001-12-2718:33:50)得10分定義一個VARIANT變量后,他應(yīng)該是一個結(jié)構(gòu)體變量,其中有一個成員是字符型的,給這個成員賦值回復(fù)人: LLnju(LLnju)(2001-12-2718:36:10)得0分實在不清楚嘛就用_variant_t,COleVariant構(gòu)造一個就行了。VARIANTvarXX;CStringstrYY;varXX.vt=VT_BSTR;varXX.bstrVal=strYY.allocsysstring();應(yīng)該可以了。回復(fù)人: softarts(CDMA2000)(2001-12-2718:42:11)得0分我也覺得COleVariant要好用一些,呵呵,我都用它。CStringstr;_variant_tvar;var=_variant_t(str);7。 COleVarant如何轉(zhuǎn)換為CString?CString如何轉(zhuǎn)換為char*CString如何轉(zhuǎn)換為char[xx]??CString如何轉(zhuǎn)換為char*wsprintf或者=CString如何轉(zhuǎn)換為char[xx]strcpy()COleVarant封裝了VAREANT類型。VAREANT類型其實是個巨大地Union,里面自然有你想要地unsignedchar*類型。CString地GetBuffer和Format可以實現(xiàn)你的后兩個問題8。 v_variant_t類型轉(zhuǎn)換成cstring總提示我cstring未定義程序如下_variant_tvfirstname;//存儲的是數(shù)據(jù)庫中的數(shù)據(jù)CStringstr;//提示出錯vfirstname=pRs->GetCollect(_variant_t("Phone_Num"));vfirstname.ChangeType(VT_BSTR);str二vfirstname.bstrVal;//提示出錯>>CStringstr;//提示出錯要求include并且設(shè)置Userun-timeLibrary為MultithreadedCString未定義,說明你的工程沒有引用MFC!!要想使你的工程支持MFC,請按照以下步驟作:1:在你的stdafx.h的頭文件中加入:#include“afxtempl.h”這是一個囊括了MFC的集合定義的頭文件,有了它,你的工程就識別Cstring類了。2:在你的工程設(shè)置中,在General頁中,選擇“MFC”為“UsingMFCinasharedDLL”O(jiān)K,現(xiàn)在再編譯你的工程即可。回復(fù)人: zhengyun_ustc("-")(2001-11-1212:06:56)得5分_variant_t的bstrVal成員是BSTR類型。它是一個指向一個OLECHART*的指針?;貜?fù)人: vickowang(小蒼)(2001-11-1212:48:21)得5分(char*)_bstr_t(vfirstname)或許你還需要一個從UNICODE字符到ANSI字符的轉(zhuǎn)變函數(shù)用vickowang(小蒼)的意見可能會有問題,轉(zhuǎn)換出的字符串應(yīng)該是亂碼。因為(char*)轉(zhuǎn)換需要一個const的字符串資源,才能強制轉(zhuǎn)換。所以應(yīng)該:_bstr_tbstrTemp=_bstr_t(vfirstname.bstrVal);TCHARszTemp[MAX_PATH];szTemp=(char*)bstrTemp;9。char*轉(zhuǎn)換為TCHAR類型??直接轉(zhuǎn)換,TCHAR相當(dāng)于char了char*s;TCHAR*s1=(TCHAR*)s;回復(fù)人: dysxq()(2001-12-2121:26:25)得0分要看你的程序設(shè)置是ANSI還是UNICODE,如果是ANSI,直接轉(zhuǎn),如果是UNICODE,TCHAR相當(dāng)于WCHAR,要用mbstowcsz轉(zhuǎn)一下Unicode:寬字節(jié)字符集1.如何取得一個既包含單字節(jié)字符又包含雙字節(jié)字符的字符串的字符個數(shù)?可以調(diào)用MicrosoftVisualC++的運行期庫包含函數(shù)—mbslen來操作多字節(jié)(既包括單字節(jié)也包括雙字節(jié))字符串。調(diào)用strlen函數(shù),無法真正了解字符串中究竟有多少字符,它只能告訴你到達(dá)結(jié)尾的0之前有多少個字節(jié)。如何對DBCS(雙字節(jié)字符集)字符串進行操作?函數(shù)描述PTSTRCharNext(LPCTSTR);返回字符串中下一個字符的地址PTSTRCharPrev(LPCTSTR,LPCTSTR);返回字符串中上一個字符的地址BOOLIsDBCSLeadByte(BYTE);如果該字節(jié)是DBCS字符的第一個字節(jié),則返回非0值為什么要使用Unicode?(1) 可以很容易地在不同語言之間進行數(shù)據(jù)交換。(2)使你能夠分配支持所有語言的單個二進制.exe文件或DLL文件。(3) 提高應(yīng)用程序的運行效率。Windows2000是使用Unicode從頭進行開發(fā)的,如果調(diào)用任何一個Windows函數(shù)并給它傳遞一個ANSI字符串,那么系統(tǒng)首先要將字符串轉(zhuǎn)換成Unicode,然后將Unicode字符串傳遞給操作系統(tǒng)。如果希望函數(shù)返回ANSI字符串,系統(tǒng)就會首先將Unicode字符串轉(zhuǎn)換成ANSI字符串,然后將結(jié)果返回給你的應(yīng)用程序。進行這些字符串的轉(zhuǎn)換需要占用系統(tǒng)的時間和內(nèi)存。通

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論