?? vc常用數據類型使用轉換詳解.htm
字號:
</SCRIPT>
<META content="MSHTML 6.00.2900.3086" name=GENERATOR></HEAD>
<BODY onload=formatonlinpic();>
<CENTER>
<SCRIPT language=JavaScript>
<!--
if (top.location != self.location)
{
top.location=self.location;
}
//-->
</SCRIPT>
<LINK href="VC常用數據類型使用轉換詳解.files/6e897d1ec11b0ef41bd5762f.css" type=text/css
rel=stylesheet><LINK href="VC常用數據類型使用轉換詳解.files/space.css" type=text/css
rel=stylesheet>
<STYLE type=text/css>#usrbar {
PADDING-RIGHT: 10px; PADDING-LEFT: 0px; FONT-SIZE: 12px; BACKGROUND: #ffffff; FILTER: alpha(opacity=65); PADDING-BOTTOM: 3px; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 19px; PADDING-TOP: 4px; FONT-FAMILY: Arial; LETTER-SPACING: normal; HEIGHT: 19px; TEXT-ALIGN: right; moz-opacity: 0.5
}
#usrbar A {
COLOR: #0000cc; TEXT-DECORATION: underline
}
#usrbar A:link {
COLOR: #0000cc; TEXT-DECORATION: underline
}
#usrbar A:visited {
COLOR: #0000cc; TEXT-DECORATION: underline
}
#ft {
CLEAR: both; FONT-SIZE: 12px; COLOR: #666666; LINE-HEIGHT: 20px; FONT-FAMILY: Arial; HEIGHT: 20px; TEXT-ALIGN: center
}
#ft A {
COLOR: #7777cc; TEXT-DECORATION: underline
}
#ft A:link {
COLOR: #7777cc; TEXT-DECORATION: underline
}
#ft A:visited {
COLOR: #7777cc; TEXT-DECORATION: underline
}
#usrbar {
LETTER-SPACING: normal
}
#usrbar A {
LETTER-SPACING: normal
}
#usrbar A:link {
LETTER-SPACING: normal
}
#usrbar A:visited {
LETTER-SPACING: normal
}
#ft {
LETTER-SPACING: normal
}
#ft A {
LETTER-SPACING: normal
}
#ft A:link {
LETTER-SPACING: normal
}
#ft A:visited {
LETTER-SPACING: normal
}
</STYLE>
<DIV id=usrbar><NOBR>
<SCRIPT> var myref = encodeURI("http://hi.baidu.com/superdbs/blog/item/18500ef499893e6fddc474cd%2Ehtml");</SCRIPT>
<A href="http://www.baidu.com/" target=_blank>百度首頁</A> | <A
href="http://hi.baidu.com/" target=_blank>百度空間</A>
<SCRIPT language=JavaScript>
document.write(" | <a href='http://passport.baidu.com/?login&tpl=sp&tpl_reg=sp&u="+myref+"'>登錄</a>");
</SCRIPT>
</NOBR></DIV>
<DIV id=main align=left><!--[if IE]>
<SCRIPT>
var objmain = document.getElementById("main");
function updatesize(){ var bodyw = window.document.body.offsetWidth; if(bodyw <= 790) objmain.style.width="772px"; else if(bodyw >= 1016) objmain.style.width="996px"; else objmain.style.width="100%"; }
updatesize(); window.onresize = updatesize;
</SCRIPT>
<![endif]-->
<DIV id=header>
<DIV class=lc>
<DIV class=rc></DIV></DIV>
<DIV class=tit><A class=titlink title="superdbs的空間 http://hi.baidu.com/superdbs"
href="http://hi.baidu.com/superdbs">懷著一份美好的心情來期待明天</A></DIV>
<DIV class=desc>踏踏實實做點事……</DIV>
<DIV id=tabline></DIV>
<DIV id=tab><A href="http://hi.baidu.com/superdbs">主頁</A><A class=on
href="http://hi.baidu.com/superdbs/blog">博客</A><A
href="http://hi.baidu.com/superdbs/album">相冊</A><SPAN>|</SPAN><A
href="http://hi.baidu.com/superdbs/profile">個人檔案</A> <SPAN>|</SPAN><A
href="http://hi.baidu.com/superdbs/friends">好友</A> </DIV></DIV>
<DIV class=stage>
<DIV class=stagepad>
<DIV style="WIDTH: 100%">
<TABLE class=modth cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=modtl width=7> </TD>
<TD class=modtc noWrap>
<DIV class=modhead><SPAN class=modtit>查看文章</SPAN></DIV></TD>
<TD class=modtc noWrap align=right></TD>
<TD class=modtr width=7> </TD></TR></TBODY></TABLE>
<DIV class=modbox id=m_blog>
<DIV class=tit>VC常用數據類型使用轉換詳解[轉]</DIV>
<DIV class=date>2007年05月10日 星期四 10:23</DIV>
<TABLE style="TABLE-LAYOUT: fixed">
<TBODY>
<TR>
<TD>
<DIV class=cnt><STRONG><FONT size=3>CString ,BSTR
,LPCTSTR之間關系和區別</FONT></STRONG><BR>CString是一個動態TCHAR數組,BSTR是一種專有格式的字符串(需要用系統提供的函數來操縱,LPCTSTR只是一個常量的TCHAR指針。<BR><BR>CString
是一個完全獨立的類,動態的TCHAR數組,封裝了 + 等操作符和字符串操作方法。<BR>typedef OLECHAR FAR*
BSTR;<BR>typedef const char * LPCTSTR;<BR><BR><STRONG><FONT face=Verdana
size=3>vc++中各種字符串的表示法</FONT></STRONG>
<P>首先char*
是指向ANSI字符數組的指針,其中每個字符占據8位(有效數據是除掉最高位的其他7位),這里保持了與傳統的C,C++的兼容。</P>
<P>LP的含義是長指針(long
pointer)。LPSTR是一個指向以‘\0’結尾的ANSI字符數組的指針,與char*可以互換使用,在win32中較多地使用LPSTR。<BR>而LPCSTR中增加的‘C’的含義是“CONSTANT”(常量),表明這種數據類型的實例不能被使用它的API函數改變,除此之外,它與LPSTR是等同的。<BR>1.LP表示長指針,在win16下有長指針(LP)和短指針(P)的區別,而在win32下是沒有區別的,都是32位.所以這里的LP和P是等價的.<BR>2.C表示const<BR>3.T是什么東西呢,我們知道TCHAR在采用Unicode方式編譯時是wchar_t,在普通時編譯成char.</P>
<P>為了滿足程序代碼國際化的需要,業界推出了Unicode標準,它提供了一種簡單和一致的表達字符串的方法,所有字符中的字節都是16位的值,其數量也可以滿足差不多世界上所有書面語言字符的編碼需求,開發程序時使用Unicode(類型為wchar_t)是一種被鼓勵的做法。</P>
<P>LPWSTR與LPCWSTR由此產生,它們的含義類似于LPSTR與LPCSTR,只是字符數據是16位的wchar_t而不是char。</P>
<P>然后為了實現兩種編碼的通用,提出了TCHAR的定義:<BR>如果定義_UNICODE,聲明如下:<BR>typedef wchar_t
TCHAR;<BR>如果沒有定義_UNICODE,則聲明如下:<BR>typedef char TCHAR;</P>
<P>LPTSTR和LPCTSTR中的含義就是每個字符是這樣的TCHAR。</P>
<P>CString類中的字符就是被聲明為TCHAR類型的,它提供了一個封裝好的類供用戶方便地使用。</P>
<P>LPCTSTR:<BR> #ifdef
_UNICODE<BR> typedef const
wchar_t * LPCTSTR;<BR>
#else<BR> typedef const
char * LPCTSTR;<BR> #endif</P>
<P><STRONG><FONT face=Verdana
size=3>VC常用數據類型使用轉換詳解<BR></FONT></STRONG><BR>先定義一些常見類型變量借以說明<BR>int i =
100;<BR>long l = 2001;<BR>float f=300.2;<BR>double d=12345.119;<BR>char
username[]="女俠程佩君";<BR>char temp[200];<BR>char *buf;<BR>CString
str;<BR>_variant_t v1;<BR>_bstr_t v2;</P>
<P><STRONG><FONT face=Verdana size=3>一、其它數據類型轉換為字符串</FONT></STRONG></P>
<P>短整型(int)<BR>
itoa(i,temp,10);
//將i轉換為字符串放入temp中,最后一個數字表示十進制<BR>
itoa(i,temp,2); //按二進制方式轉換
<BR>長整型(long)<BR>
ltoa(l,temp,10);</P>
<P><BR><STRONG><FONT face=Verdana
size=3>二、從其它包含字符串的變量中獲取指向該字符串的指針</FONT></STRONG></P>
<P>CString變量<BR>str = "2008北京奧運";<BR>buf = (LPSTR)(LPCTSTR)str;
<BR>BSTR類型的_variant_t變量<BR>v1 = (_bstr_t)"程序員";<BR>buf =
_com_util::ConvertBSTRToString((_bstr_t)v1);</P>
<P><STRONG><FONT
size=3>三、字符串轉換為其它數據類型<BR></FONT></STRONG>strcpy(temp,"123"); </P>
<P>短整型(int)<BR> i = atoi(temp);
<BR>長整型(long)<BR> l = atol(temp);
<BR>浮點(double)<BR> d = atof(temp);</P>
<P><STRONG><FONT size=3>四、其它數據類型轉換到CString</FONT></STRONG></P>
<P>使用CString的成員函數Format來轉換,例如:</P>
<P>整數(int)<BR> str.Format("%d",i);
<BR>浮點數(float)<BR> str.Format("%f",i);
<BR>字符串指針(char
*)等已經被CString構造函數支持的數據類型可以直接賦值<BR> str
= username;</P>
<P><STRONG><FONT face=Verdana
size=3>五、BSTR、_bstr_t與CComBSTR</FONT></STRONG></P>
<P>CComBSTR、_bstr_t是對BSTR的封裝,BSTR是指向字符串的32位指針。<BR>char *轉換到BSTR可以這樣: BSTR
b=_com_util::ConvertStringToBSTR("數據");
//使用前需要加上頭文件comutil.h<BR>反之可以使用char
*p=_com_util::ConvertBSTRToString(b);</P>
<P><BR><FONT face=Verdana size=3><STRONG>六、VARIANT 、_variant_t 與
COleVariant</STRONG></FONT></P>
<P>VARIANT的結構可以參考頭文件VC98\Include\OAIDL.H中關于結構體tagVARIANT的定義。<BR>對于VARIANT變量的賦值:首先給vt成員賦值,指明數據類型,再對聯合結構中相同數據類型的變量賦值,舉個例子:<BR>VARIANT
va;<BR>int a=2001;<BR>va.vt=VT_I4;
//指明整型數據<BR>va.lVal=a; //賦值</P>
<P>對于不馬上賦值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR*
pvarg);進行初始化,其本質是將vt設置為VT_EMPTY,下表我們列舉vt與常用數據的對應關系:</P>
<P>unsigned char bVal; VT_UI1 <BR>short iVal; VT_I2 <BR>long
lVal; VT_I4 <BR>float fltVal; VT_R4
<BR>double dblVal; VT_R8 <BR>VARIANT_BOOL
boolVal; VT_BOOL <BR>SCODE scode; VT_ERROR <BR>CY
cyVal; VT_CY <BR>DATE date; VT_DATE <BR>BSTR
bstrVal; VT_BSTR <BR>IUnknown FAR* punkVal;
VT_UNKNOWN <BR>IDispatch FAR* pdispVal; VT_DISPATCH
<BR>SAFEARRAY FAR* parray; VT_ARRAY|* <BR>unsigned char FAR*
pbVal; VT_BYREF|VT_UI1 <BR>short FAR* piVal;
VT_BYREF|VT_I2 <BR>long FAR* plVal; VT_BYREF|VT_I4 <BR>float
FAR* pfltVal; VT_BYREF|VT_R4 <BR>double FAR* pdblVal;
VT_BYREF|VT_R8 <BR>VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL <BR>SCODE
FAR* pscode; VT_BYREF|VT_ERROR <BR>CY FAR* pcyVal;
VT_BYREF|VT_CY <BR>DATE FAR* pdate; VT_BYREF|VT_DATE <BR>BSTR FAR*
pbstrVal; VT_BYREF|VT_BSTR <BR>IUnknown FAR* FAR*
ppunkVal; VT_BYREF|VT_UNKNOWN <BR>IDispatch FAR* FAR*
ppdispVal; VT_BYREF|VT_DISPATCH <BR>SAFEARRAY FAR* FAR*
pparray; VT_ARRAY|* <BR>VARIANT FAR* pvarVal;
VT_BYREF|VT_VARIANT <BR>void FAR* byref; VT_BYREF </P>
<P>_variant_t是VARIANT的封裝類,其賦值可以使用強制類型轉換,其構造函數會自動處理這些數據類型。<BR>例如:<BR>long
l=222;<BR>ing i=100;<BR>_variant_t lVal(l);<BR>lVal = (long)i;</P>
<P>COleVariant的使用與_variant_t的方法基本一樣,請參考如下例子:<BR>COleVariant v3 = "字符串", v4
= (long)1999;<BR>CString str =(BSTR)v3.pbstrVal;<BR>long i = v4.lVal;</P>
<P><STRONG><FONT size=3>七、其它</FONT></STRONG></P>
<P>對消息的處理中我們經常需要將WPARAM或LPARAM等32位數據(DWORD)分解成兩個16位數據(WORD),例如:<BR>LPARAM
lParam;<BR>WORD loValue = LOWORD(lParam);
//取低16位<BR>WORD hiValue = HIWORD(lParam);
//取高16位 <BR>對于16位的數據(WORD)我們可以用同樣的方法分解成高低兩個8位數據(BYTE),例如:<BR>WORD
wValue;<BR>BYTE loValue = LOBYTE(wValue);
//取低8位<BR>BYTE hiValue = HIBYTE(wValue);
//取高8位 <BR><BR><FONT face=Verdana
size=3><STRONG>如何將CString類型的變量賦給char*類型的變量<BR></STRONG></FONT>1、GetBuffer函數:<BR>使用CString::GetBuffer函數。<BR>char
*p; <BR>CString str="hello"; <BR>p=str.GetBuffer(str.GetLength());
<BR>str.ReleaseBuffer();</P>
<P>將CString轉換成char * 時<BR>CString
str("aaaaaaa");<BR>strcpy(str.GetBuffer(10),"aa");<BR>str.ReleaseBuffer();<BR>當我們需要字符數組時調用GetBuffer(int
n),其中n為我們需要的字符數組的長度.使用完成后一定要馬上調用ReleaseBuffer();<BR>還有很重要的一點就是,在能使用const
char *的地方,就不要使用char *</P>
<P>2、memcpy: <BR>CString mCS=_T("cxl"); <BR>char mch[20];
<BR>memcpy(mch,mCS,20); </P>
<P>3、用LPCTSTR強制轉換: 盡量不使用<BR>char *ch; <BR>CString str;
<BR>ch=(LPSTR)(LPCTSTR)str; </P>
<P>CString str = "good";<BR>char
*tmp;<BR>sprintf(tmp,"%s",(LPTSTR)(LPCTSTR)str); </P>
<P>4、<BR>CString Msg; <BR>Msg=Msg+"abc"; <BR>LPTSTR lpsz; <BR>lpsz = new
TCHAR[Msg.GetLength()+1]; <BR>_tcscpy(lpsz, Msg); <BR>char * psz;
<BR>strcpy(psz,lpsz); </P>
<P><BR><STRONG><FONT face=Verdana size=3>CString類向const char
*轉換</FONT></STRONG><BR>char a[100];<BR>CString
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -