vc常用数据类型使用转换详解.htm
来自「VC常用数据类型」· HTM 代码 · 共 664 行 · 第 1/3 页
HTM
664 行
</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 + =
减小字号Ctrl + -
显示快捷键?