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>&nbsp;</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>&nbsp;</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #ifdef 
      _UNICODE<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef const 
      wchar_t * LPCTSTR;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      #else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef const 
      char * LPCTSTR;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      itoa(i,temp,10);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      //将i转换为字符串放入temp中,最后一个数字表示十进制<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      itoa(i,temp,2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //按二进制方式转换 
      <BR>长整型(long)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = atoi(temp); 
      <BR>长整型(long)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l = atol(temp); 
      <BR>浮点(double)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d = atof(temp);</P>
      <P><STRONG><FONT size=3>四、其它数据类型转换到CString</FONT></STRONG></P>
      <P>使用CString的成员函数Format来转换,例如:</P>
      <P>整数(int)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str.Format("%d",i); 
      <BR>浮点数(float)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str.Format("%f",i); 
      <BR>字符串指针(char 
      *)等已经被CString构造函数支持的数据类型可以直接赋值<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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("数据");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      //使用前需要加上头文件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;&nbsp;&nbsp;&nbsp;&nbsp; 
      //指明整型数据<BR>va.lVal=a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //赋值</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;&nbsp;&nbsp; VT_I4&nbsp;&nbsp;<BR>float fltVal;&nbsp;&nbsp; VT_R4 
      <BR>double dblVal;&nbsp;&nbsp; VT_R8&nbsp;&nbsp;<BR>VARIANT_BOOL 
      boolVal;&nbsp;&nbsp; VT_BOOL <BR>SCODE scode;&nbsp;&nbsp; VT_ERROR <BR>CY 
      cyVal;&nbsp;&nbsp; VT_CY <BR>DATE date;&nbsp;&nbsp; VT_DATE <BR>BSTR 
      bstrVal;&nbsp;&nbsp; VT_BSTR <BR>IUnknown FAR* punkVal;&nbsp;&nbsp; 
      VT_UNKNOWN <BR>IDispatch FAR* pdispVal;&nbsp;&nbsp; VT_DISPATCH 
      <BR>SAFEARRAY FAR* parray;&nbsp;&nbsp; VT_ARRAY|* <BR>unsigned char FAR* 
      pbVal;&nbsp;&nbsp; VT_BYREF|VT_UI1 <BR>short FAR* piVal;&nbsp;&nbsp; 
      VT_BYREF|VT_I2 <BR>long FAR* plVal;&nbsp;&nbsp; VT_BYREF|VT_I4 <BR>float 
      FAR* pfltVal;&nbsp;&nbsp; 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;&nbsp;&nbsp; VT_BYREF|VT_ERROR <BR>CY FAR* pcyVal;&nbsp;&nbsp; 
      VT_BYREF|VT_CY <BR>DATE FAR* pdate; VT_BYREF|VT_DATE <BR>BSTR FAR* 
      pbstrVal;&nbsp;&nbsp; VT_BYREF|VT_BSTR <BR>IUnknown FAR* FAR* 
      ppunkVal;&nbsp;&nbsp; VT_BYREF|VT_UNKNOWN <BR>IDispatch FAR* FAR* 
      ppdispVal; VT_BYREF|VT_DISPATCH <BR>SAFEARRAY FAR* FAR* 
      pparray;&nbsp;&nbsp; VT_ARRAY|* <BR>VARIANT FAR* pvarVal;&nbsp;&nbsp; 
      VT_BYREF|VT_VARIANT <BR>void FAR* byref;&nbsp;&nbsp; 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);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      //取低16位<BR>WORD hiValue = HIWORD(lParam);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      //取高16位 <BR>对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:<BR>WORD 
      wValue;<BR>BYTE loValue = LOBYTE(wValue);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      //取低8位<BR>BYTE hiValue = HIBYTE(wValue);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      //取高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 + -
显示快捷键?