⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 --有关数据类型转换的整理.htm

📁 有关VC开发过程中常被人忘记的
💻 HTM
📖 第 1 页 / 共 5 页
字号:
              <TBODY>
              <TR>
                <TD><STRONG>Blog信息</STRONG></TD></TR>
              <TR>
                <TD>
                  <DIV 
                  align=left>blog名称:<BR>日志总数:131<BR>评论数量:146<BR>留言数量:4<BR>访问次数:177224<BR>建立时间:2005年12月29日 
                  </DIV></TD></TR></TBODY></TABLE>
            <P align=center><A 
            href="http://blogger.org.cn/blog/rss2.asp?name=newqiang" 
            target=_blank><IMG height=14 src="--有关数据类型转换的整理.files/xml.gif" 
            width=36 border=0></A><BR></P>
            <DIV align=center></DIV>
            <DIV align=center><BR></DIV></TD></TR></TBODY></TABLE></TD>
    <TD vAlign=top align=middle><BR>
      <DIV id=googlead1 style="DISPLAY: block; FLOAT: none"></DIV>
      <STYLE type=text/css>A.categorylink:link {
	COLOR: #999999
}
A.categorylink:visited {
	COLOR: #999999
}
A.categorylink:active {
	COLOR: #999999
}
A.categorylink:hover {
	COLOR: #ff9900
}
</STYLE>

      <TABLE style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellSpacing=1 
      cellPadding=3 width="98%" bgColor=#cccccc border=0>
        <TBODY>
        <TR bgColor=#f8f8f8>
          <TD>
            <P><FONT size=4><STRONG><IMG src="--有关数据类型转换的整理.files/1.gif"><A 
            href="http://blogger.org.cn/blog/blog.asp?name=newqiang&amp;subjectid=1766">[编程学习]<A 
            href="http://blogger.org.cn/blog/more.asp?name=newqiang&amp;id=12017">有关数据类型转换的整理</A></STRONG></FONT><BR><A 
            class=categorylink 
            href="http://blogger.org.cn/blog/list.asp?classid=46" 
            target=_blank>网上资源</A></P>
            <P><A href="http://blogger.org.cn/blog/blog.asp?name=newqiang" 
            target=_blank>newqiang</A> 发表于 2006-2-25 9:47:36 </P></TD></TR>
        <TR bgColor=#ffffff>
          <TD height=0>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD>
                  <P>对论坛中有关数据类型转换的整理<BR>整理:Vision 
                  Deng<BR>--------------------------------------------------------------------------------<BR>说明:本文纯粹是总结一下有关类型转换的贴子,本人并未对所有方法都做测试,仅仅是为了给大家一个参考。</P>
                  <P>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>一、其它数据类型转换为字符串</P>
                  <P><BR>短整型(int)<BR>itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制<BR>itoa(i,temp,2); 
                  ///按二进制方式转换 <BR>长整型(long)<BR>ltoa(l,temp,10); 
                  <BR>浮点数(float,double)<BR>用fcvt可以完成转换,这是MSDN中的例子:<BR>int 
                  decimal, sign; <BR>char *buffer; <BR>double source = 
                  3.1415926535; <BR>buffer = _fcvt( source, 7, &amp;decimal, 
                  &amp;sign ); <BR>运行结果:source: 3.1415926535 buffer: '31415927' 
                  decimal: 1 sign: 0<BR>decimal表示小数点的位置,sign表示符号:0为正数,1为负数 
                  <BR>CString变量<BR>str = "2008北京奥运";<BR>buf = 
                  (LPSTR)(LPCTSTR)str; <BR>BSTR变量<BR>BSTR bstrValue = 
                  ::SysAllocString(L"程序员"); <BR>char * buf = 
                  _com_util::ConvertBSTRToString(bstrValue); 
                  <BR>SysFreeString(bstrValue); <BR>AfxMessageBox(buf); 
                  <BR>delete(buf); <BR>CComBSTR变量<BR>CComBSTR bstrVar("test"); 
                  <BR>char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str); 
                  <BR>AfxMessageBox(buf); <BR>delete(buf); </P>
                  <P>_bstr_t变量<BR>_bstr_t类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用<BR>_bstr_t 
                  bstrVar("test"); <BR>const char *buf = bstrVar;///不要修改buf中的内容 
                  <BR>AfxMessageBox(buf); </P>
                  <P><BR>通用方法(针对非COM数据类型)<BR>用sprintf完成转换</P>
                  <P>char&nbsp; buffer[200];<BR>char&nbsp; c = 
                  '1';<BR>int&nbsp;&nbsp; i = 35;<BR>long&nbsp; j = 
                  1000;<BR>float f = 1.7320534f;<BR>sprintf( buffer, 
                  "%c",c);<BR>sprintf( buffer, "%d",i);<BR>sprintf( buffer, 
                  "%d",j);<BR>sprintf( buffer, "%f",f);</P>
                  <P>二、字符串转换为其它数据类型<BR>strcpy(temp,"123"); </P>
                  <P>短整型(int)<BR>i = atoi(temp); <BR>长整型(long)<BR>l = 
                  atol(temp); <BR>浮点(double)<BR>d = atof(temp); 
                  <BR>CString变量<BR>CString name = temp; <BR>BSTR变量 <BR>BSTR 
                  bstrValue = ::SysAllocString(L"程序员"); 
                  <BR>...///完成对bstrValue的使用<BR>SysFreeString(bstrValue); </P>
                  <P>CComBSTR变量<BR>CComBSTR类型变量可以直接赋值<BR>CComBSTR 
                  bstrVar1("test");<BR>CComBSTR bstrVar2(temp);</P>
                  <P>_bstr_t变量<BR>_bstr_t类型的变量可以直接赋值<BR>_bstr_t 
                  bstrVar1("test"); <BR>_bstr_t bstrVar2(temp); </P>
                  <P><BR>三、其它数据类型转换到CString<BR>使用CString的成员函数Format来转换,例如:</P>
                  <P><BR>整数(int)<BR>str.Format("%d",i); 
                  <BR>浮点数(float)<BR>str.Format("%f",i); <BR>字符串指针(char 
                  *)等已经被CString构造函数支持的数据类型可以直接赋值<BR>str = username; 
                  <BR>对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char *的方法先转到char 
                  *,然后赋值给CString变量。</P>
                  <P>四、BSTR、_bstr_t与CComBSTR</P>
                  <P><BR>CComBSTR 
                  是ATL对BSTR的封装,_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不直接指向字串的缓冲区。<BR>char 
                  *转换到BSTR可以这样: <BR>BSTR 
                  b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上comutil.h和comsupp.lib<BR>SysFreeString(bstrValue); 
                  <BR>反之可以使用<BR>char 
                  *p=_com_util::ConvertBSTRToString(b);<BR>delete 
                  p;<BR>具体可以参考一,二段落里的具体说明。</P>
                  <P>CComBSTR与_bstr_t对大量的操作符进行了重载,可以直接进行=,!=,==等操作,所以使用非常方便。<BR>特别是_bstr_t,建议大家使用它。</P>
                  <P>五、VARIANT 、_variant_t 与 COleVariant</P>
                  <P><BR>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>Byte bVal;&nbsp; // VT_UI1. <BR>Short iVal;&nbsp; // VT_I2. 
                  <BR>long lVal;&nbsp; // VT_I4. <BR>float fltVal;&nbsp; // 
                  VT_R4. <BR>double dblVal;&nbsp; // VT_R8. <BR>VARIANT_BOOL 
                  boolVal;&nbsp; // VT_BOOL. <BR>SCODE scode;&nbsp; // VT_ERROR. 
                  <BR>CY cyVal;&nbsp; // VT_CY. <BR>DATE date;&nbsp; // VT_DATE. 
                  <BR>BSTR bstrVal;&nbsp; // VT_BSTR. <BR>DECIMAL FAR* 
                  pdecVal&nbsp; // VT_BYREF|VT_DECIMAL. <BR>IUnknown FAR* 
                  punkVal;&nbsp; // VT_UNKNOWN. <BR>IDispatch FAR* 
                  pdispVal;&nbsp; // VT_DISPATCH. <BR>SAFEARRAY FAR* 
                  parray;&nbsp; // VT_ARRAY|*. <BR>Byte FAR* pbVal;&nbsp; // 
                  VT_BYREF|VT_UI1. <BR>short FAR* piVal;&nbsp; // 
                  VT_BYREF|VT_I2. <BR>long FAR* plVal;&nbsp; // VT_BYREF|VT_I4. 
                  <BR>float FAR* pfltVal;&nbsp; // VT_BYREF|VT_R4. <BR>double 
                  FAR* pdblVal;&nbsp; // VT_BYREF|VT_R8. <BR>VARIANT_BOOL FAR* 
                  pboolVal;&nbsp; // VT_BYREF|VT_BOOL. <BR>SCODE FAR* 
                  pscode;&nbsp; // VT_BYREF|VT_ERROR. <BR>CY FAR* pcyVal;&nbsp; 
                  // VT_BYREF|VT_CY. <BR>DATE FAR* pdate;&nbsp; // 
                  VT_BYREF|VT_DATE. <BR>BSTR FAR* pbstrVal;&nbsp; // 
                  VT_BYREF|VT_BSTR. <BR>IUnknown FAR* FAR* ppunkVal;&nbsp; // 
                  VT_BYREF|VT_UNKNOWN. <BR>IDispatch FAR* FAR* ppdispVal;&nbsp; 
                  // VT_BYREF|VT_DISPATCH. <BR>SAFEARRAY FAR* FAR* 
                  pparray;&nbsp; // VT_ARRAY|*. <BR>VARIANT FAR* pvarVal;&nbsp; 
                  // VT_BYREF|VT_VARIANT. <BR>void FAR* byref;&nbsp; // Generic 
                  ByRef. <BR>char cVal;&nbsp; // VT_I1. <BR>unsigned short 
                  uiVal;&nbsp; // VT_UI2. <BR>unsigned long ulVal;&nbsp; // 
                  VT_UI4. <BR>int intVal;&nbsp; // VT_INT. <BR>unsigned int 
                  uintVal;&nbsp; // VT_UINT. <BR>char FAR * pcVal;&nbsp; // 
                  VT_BYREF|VT_I1. <BR>unsigned short FAR * puiVal;&nbsp; // 
                  VT_BYREF|VT_UI2. <BR>unsigned long FAR * pulVal;&nbsp; // 
                  VT_BYREF|VT_UI4. <BR>int FAR * pintVal;&nbsp; // 
                  VT_BYREF|VT_INT. <BR>unsigned int FAR * puintVal;&nbsp; 
                  //VT_BYREF|VT_UINT. </P>
                  <P><BR>_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。<BR>使用时需加上#include 
                  &lt;comdef.h&gt;<BR>例如:<BR>long l=222;<BR>ing 
                  i=100;<BR>_variant_t lVal(l);<BR>lVal = (long)i;</P>
                  <P><BR>COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:<BR>COleVariant 
                  v3 = "字符串", v4 = (long)1999;<BR>CString str 
                  =(BSTR)v3.pbstrVal;<BR>long i = v4.lVal;</P>
                  <P><BR>六、其它一些COM数据类型</P>
                  <P>根据ProgID得到CLSID<BR>HRESULT CLSIDFromProgID( LPCOLESTR 
                  lpszProgID,LPCLSID pclsid);<BR>CLSID 
                  clsid;<BR>CLSIDFromProgID( L"MAPI.Folder",&amp;clsid);</P>
                  <P>根据CLSID得到ProgID<BR>WINOLEAPI ProgIDFromCLSID( REFCLSID 
                  clsid,LPOLESTR * lplpszProgID); <BR>例如我们已经定义了 
                  CLSID_IApplication,下面的代码得到ProgID<BR>LPOLESTR pProgID = 
                  0;<BR>ProgIDFromCLSID( 
                  CLSID_IApplication,&amp;pProgID);<BR>...///可以使用pProgID 
                  <BR>CoTaskMemFree(pProgID);//不要忘记释放 </P>
                  <P>七、ANSI与Unicode<BR>Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。</P>
                  <P>将ANSI转换到Unicode<BR>(1)通过L这个宏来实现,例如: CLSIDFromProgID( 
                  L"MAPI.Folder",&amp;clsid);<BR>(2)通过MultiByteToWideChar函数实现转换,例如:<BR>char 
                  *szProgID = "MAPI.Folder";<BR>WCHAR 
                  szWideProgID[128];<BR>CLSID clsid;<BR>long lLen = 
                  MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));<BR>szWideProgID[lLen] 
                  = '\0'; <BR>(3)通过A2W宏来实现,例如: <BR>USES_CONVERSION; 
                  <BR>CLSIDFromProgID( A2W(szProgID),&amp;clsid); 
                  <BR>将Unicode转换到ANSI<BR>(1)使用WideCharToMultiByte,例如:<BR>// 
                  假设已经有了一个Unicode 串 wszSomeString... <BR>char szANSIString 
                  [MAX_PATH]; <BR>WideCharToMultiByte ( CP_ACP, 
                  WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, 
                  sizeof(szANSIString), NULL, NULL ); 
                  <BR>(2)使用W2A宏来实现,例如:<BR>USES_CONVERSION;<BR>pTemp=W2A(wszSomeString); 
                  <BR>八、其它</P>
                  <P>对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:<BR>LPARAM 
                  lParam;<BR>WORD loValue = LOWORD(lParam);///取低16位<BR>WORD 
                  hiValue = HIWORD(lParam);///取高16位</P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -