﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-huahit-文章分类-VC</title><link>http://www.cppblog.com/huahit/category/2253.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 21 Oct 2011 07:16:18 GMT</lastBuildDate><pubDate>Fri, 21 Oct 2011 07:16:18 GMT</pubDate><ttl>60</ttl><item><title>BOOL与bool的区别（转）</title><link>http://www.cppblog.com/huahit/articles/158760.html</link><dc:creator>无为斋</dc:creator><author>无为斋</author><pubDate>Thu, 20 Oct 2011 08:18:00 GMT</pubDate><guid>http://www.cppblog.com/huahit/articles/158760.html</guid><wfw:comment>http://www.cppblog.com/huahit/comments/158760.html</wfw:comment><comments>http://www.cppblog.com/huahit/articles/158760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huahit/comments/commentRss/158760.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huahit/services/trackbacks/158760.html</trackback:ping><description><![CDATA[<p>1、类型不同<br />bool为布尔型<br />BOOL为int型<br />2、长度不同<br />bool只有一个字节<br />BOOL长度视实际环境来定，一般可认为是int类型的大小4个字节<br />3、取值不同<br />bool取值false和true，是0和1的区别<br />BOOL取值FALSE和TRUE，是0和非0的区别<br />4、<br />bool是标准C/C++数据类型，可取值true和false。单独占一个字节，如果数个bool对象列在一起，可能会各占一个bit，这取决于编译器。<br />BOOL是微软定义的，用途是解决程序在C与C++中环境的差异,以下是FALSE/TRUE在windef.h的定义：<br />#ifndef FALSE<br />#define FALSE 0<br />#endif<br />#ifndef TRUE<br />#define TRUE 1<br />#endif 。与bool不同，它是一个三值逻辑，TRUE/FALSE/ERROR，返回值为&gt;0的整数为TRUE，0为FALSE，-1为ERROR。Win32 API中很多返回值为BOOL的函数都是三值逻辑。比如GetMessage。</p>
<p>所以两者不一样的，只不过我们在使用中没有这种感觉，因为C++会帮你做隐式转换。<br />5、例子<br />bool x=3; //告警<br />bool x=1; //正确<br />BOOL x=3; //正确<br />BOOL x=3.3; //告警</p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/huahit/aggbug/158760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huahit/" target="_blank">无为斋</a> 2011-10-20 16:18 <a href="http://www.cppblog.com/huahit/articles/158760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC常用数据类型使用转换详解 zz</title><link>http://www.cppblog.com/huahit/articles/65068.html</link><dc:creator>无为斋</dc:creator><author>无为斋</author><pubDate>Sun, 26 Oct 2008 03:17:00 GMT</pubDate><guid>http://www.cppblog.com/huahit/articles/65068.html</guid><wfw:comment>http://www.cppblog.com/huahit/comments/65068.html</wfw:comment><comments>http://www.cppblog.com/huahit/articles/65068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huahit/comments/commentRss/65068.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huahit/services/trackbacks/65068.html</trackback:ping><description><![CDATA[VC常用数据类型使用转换详解 - 西祠胡同<br><a href="http://www.xici.net/b304234/d49240600.htm">http://www.xici.net/b304234/d49240600.htm</a><br><br><br>很早以前在某大学BBS上下载的。刚才整理文件，又看到它了。贴上去，大家共享。<br>刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解，本文将介绍一些常用数据类型的使用。
<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><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>_bstr_t变量<br>_bstr_t类型是对BSTR的封装，因为已经重载了=操作符，所以很容易使用<br>_bstr_t bstrVar("test"); <br>const char *buf = bstrVar;///不要修改buf中的内容 <br>AfxMessageBox(buf);
<p><br>通用方法(针对非COM数据类型)<br>用sprintf完成转换<br>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>二、字符串转换为其它数据类型<br>strcpy(temp,"123");
<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>CComBSTR变量<br>CComBSTR类型变量可以直接赋值<br>CComBSTR bstrVar1("test");<br>CComBSTR bstrVar2(temp);
<p>_bstr_t变量<br>_bstr_t类型的变量可以直接赋值<br>_bstr_t bstrVar1("test"); <br>_bstr_t bstrVar2(temp);
<p><br>三、其它数据类型转换到CString<br>使用CString的成员函数Format来转换,例如:
<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>四、BSTR、_bstr_t与CComBSTR
<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>CComBSTR与_bstr_t对大量的操作符进行了重载，可以直接进行=,!=,==等操作，所以使用非常方便。<br>特别是_bstr_t,建议大家使用它。
<p><br>五、VARIANT 、_variant_t 与 COleVariant
<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>对于不马上赋值的VARIANT，最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
<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><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><br>COleVariant的使用与_variant_t的方法基本一样，请参考如下例子：<br>COleVariant v3 = "字符串", v4 = (long)1999;<br>CString str =(BSTR)v3.pbstrVal;<br>long i = v4.lVal;
<p><br>六、其它一些COM数据类型
<p>根据ProgID得到CLSID<br>HRESULT CLSIDFromProgID( LPCOLESTR lpszProgID,LPCLSID pclsid);<br>CLSID clsid;<br>CLSIDFromProgID( L"MAPI.Folder",&amp;clsid);
<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>七、ANSI与Unicode<br>Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。
<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>对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据（DWORD)分解成两个16位数据（WORD),例如：<br>LPARAM lParam;<br>WORD loValue = LOWORD(lParam);///取低16位<br>WORD hiValue = HIWORD(lParam);///取高16位
<p><br>对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:<br>WORD wValue;<br>BYTE loValue = LOBYTE(wValue);///取低8位<br>BYTE hiValue = HIBYTE(wValue);///取高8位
<p><br>两个16位数据（WORD）合成32位数据(DWORD,LRESULT,LPARAM,或WPARAM)<br>LONG MAKELONG( WORD wLow, WORD wHigh );<br>WPARAM MAKEWPARAM( WORD wLow, WORD wHigh ); <br>LPARAM MAKELPARAM( WORD wLow, WORD wHigh );<br>LRESULT MAKELRESULT( WORD wLow, WORD wHigh );
<p><br>两个8位的数据(BYTE)合成16位的数据(WORD)<br>WORD MAKEWORD( BYTE bLow, BYTE bHigh );
<p><br>从R(red),G(green),B(blue)三色得到COLORREF类型的颜色值<br>COLORREF RGB( BYTE byRed,BYTE byGreen,BYTE byBlue );<br>例如COLORREF bkcolor = RGB(0x22,0x98,0x34);
<p><br>从COLORREF类型的颜色值得到RGB三个颜色值<br>BYTE Red = GetRValue(bkcolor); ///得到红颜色<br>BYTE Green = GetGValue(bkcolor); ///得到绿颜色<br>BYTE Blue = GetBValue(bkcolor); ///得到兰颜色
<p><br>九、注意事项<br>假如需要使用到ConvertBSTRToString此类函数,需要加上头文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragma comment( lib, "comsupp.lib" )<br><br></p>
<img src ="http://www.cppblog.com/huahit/aggbug/65068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huahit/" target="_blank">无为斋</a> 2008-10-26 11:17 <a href="http://www.cppblog.com/huahit/articles/65068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Visual C++ 6.0编译指示</title><link>http://www.cppblog.com/huahit/articles/10206.html</link><dc:creator>无为斋</dc:creator><author>无为斋</author><pubDate>Wed, 19 Jul 2006 01:40:00 GMT</pubDate><guid>http://www.cppblog.com/huahit/articles/10206.html</guid><wfw:comment>http://www.cppblog.com/huahit/comments/10206.html</wfw:comment><comments>http://www.cppblog.com/huahit/articles/10206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huahit/comments/commentRss/10206.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huahit/services/trackbacks/10206.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Document Source:																												Pragma Directives, Preprocessor Reference, Visual C++ Programmer Guide.																																						 																		...&nbsp;&nbsp;<a href='http://www.cppblog.com/huahit/articles/10206.html'>阅读全文</a><img src ="http://www.cppblog.com/huahit/aggbug/10206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huahit/" target="_blank">无为斋</a> 2006-07-19 09:40 <a href="http://www.cppblog.com/huahit/articles/10206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title># VC常用数据类型使用转换详解 [转] </title><link>http://www.cppblog.com/huahit/articles/10185.html</link><dc:creator>无为斋</dc:creator><author>无为斋</author><pubDate>Tue, 18 Jul 2006 03:21:00 GMT</pubDate><guid>http://www.cppblog.com/huahit/articles/10185.html</guid><wfw:comment>http://www.cppblog.com/huahit/comments/10185.html</wfw:comment><comments>http://www.cppblog.com/huahit/articles/10185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huahit/comments/commentRss/10185.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huahit/services/trackbacks/10185.html</trackback:ping><description><![CDATA[////////////////////////////////// <br />CString -&gt; char* <br />////////////////////////////////// <br />#include "atlbase.h" <br />CString strTmp; <br />char* cpTmp; <br />USES_CONVERSION <br />cpTmp=T2A(strTmp); <br />////////////////////////////////// <br />这是同事发现的最简单的办法!!!! <br />////////////////////////////////// <br /><br /><br />刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解，本文将介绍一些常用数据类型的使用。 <br /><br />我们先定义一些常见类型变量借以说明 <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; <br /><br />一、其它数据类型转换为字符串 <br /><br /><br />短整型（int） <br />itoa（i,temp,10）;///将i转换为字符串放入temp中,最后一个数字表示十进制 <br />itoa（i,temp,2）; ///按二进制方式转换 <br />长整型（long） <br />ltoa（l,temp,10）; <br /><br /><br />二、从其它包含字符串的变量中获取指向该字符串的指针 <br />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）; <br /><br />三、字符串转换为其它数据类型 <br />strcpy（temp,＂123＂）; <br /><br />短整型（int） <br />i = atoi（temp）; <br />长整型（long） <br />l = atol（temp）; <br />浮点（double） <br />d = atof（temp）; <br /><br />四、其它数据类型转换到CString <br />使用CString的成员函数Format来转换,例如: <br /><br /><br />整数（int） <br />str.Format（＂%d＂,i）; <br />浮点数（float） <br />str.Format（＂%f＂,i）; <br />字符串指针（char *）等已经被CString构造函数支持的数据类型可以直接赋值 <br />str = username; <br /><br />五、BSTR、_bstr_t与CComBSTR <br /><br /><br />CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。 <br />char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR（＂数据＂）;///使用前需要加上头文件comutil.h <br />反之可以使用char *p=_com_util::ConvertBSTRToString（b）; <br /><br /><br />六、VARIANT 、_variant_t 与 COleVariant <br /><br /><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; ///赋值 <br /><br />对于不马上赋值的VARIANT，最好先用Void VariantInit（VARIANTARG FAR* pvarg）;进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系: <br /><br />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 <br /><br /><br />_variant_t是VARIANT的封装类，其赋值可以使用强制类型转换，其构造函数会自动处理这些数据类型。 <br />例如： <br />long l=222; <br />ing i=100; <br />_variant_t lVal（l）; <br />lVal = （long）i; <br /><br /><br />COleVariant的使用与_variant_t的方法基本一样，请参考如下例子： <br />COleVariant v3 = ＂字符串＂, v4 = （long）1999; <br />CString str =（BSTR）v3.pbstrVal; <br />long i = v4.lVal; <br /><br /><br />七、其它 <br /><br />对消息的处理中我们经常需要将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 /><br /><br /><br />MultiByteToWideChar和WideCharToMultiByte <br /><br />BSTR、char*和CString转换 
<p>　　(1) char*转换成CString</p><p>　　若将char*转换成CString，除了直接赋值外，还可使用CString::Format进行。例如：</p><p>char chArray[] = "This is a test"; <br />char * p = "This is a test"; </p><p>　　或</p><p>LPSTR p = "This is a test"; </p><p>　　或在已定义Unicode应的用程序中</p><p>TCHAR * p = _T("This is a test"); </p><p>　　或</p><p>LPTSTR p = _T("This is a test"); <br />CString theString = chArray; <br />theString.Format(_T("%s"), chArray); <br />theString = p; </p><p>　　(2) CString转换成char*</p><p>　　若将CString类转换成char*(LPSTR)类型，常常使用下列三种方法：</p><p>　　方法一，使用强制转换。例如：</p><p>CString theString( "This is a test" ); <br />LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;  </p><p>　　方法二，使用strcpy。例如：</p><p>CString theString( "This is a test" ); <br />LPTSTR lpsz = new TCHAR[theString.GetLength()+1]; <br />_tcscpy(lpsz, theString); </p><p>　　需要说明的是，strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI)，系统编译器将会自动对其进行转换。</p><p>　　方法三，使用CString::GetBuffer。例如：</p><p>CString s(_T("This is a test ")); <br />LPTSTR p = s.GetBuffer(); <br />// 在这里添加使用p的代码 <br />if(p != NULL) *p = _T('\0'); <br />s.ReleaseBuffer(); <br />// 使用完后及时释放，以便能使用其它的CString成员函数 </p><p>　　(3) BSTR转换成char*</p><p>　　方法一，使用ConvertBSTRToString。例如：</p><p>#include <br />#pragma comment(lib, "comsupp.lib") <br />int _tmain(int argc, _TCHAR* argv[]){ <br />BSTR bstrText = ::SysAllocString(L"Test"); <br />char* lpszText2 = _com_util::ConvertBSTRToString(bstrText); <br />SysFreeString(bstrText); // 用完释放 <br />delete[] lpszText2; <br />return 0; <br />}  </p><p>　　方法二，使用_bstr_t的赋值运算符重载。例如：</p><p>_bstr_t b = bstrText; <br />char* lpszText2 = b; </p><p>　　(4) char*转换成BSTR</p><p>　　方法一，使用SysAllocString等API函数。例如：</p><p>BSTR bstrText = ::SysAllocString(L"Test"); <br />BSTR bstrText = ::SysAllocStringLen(L"Test",4); <br />BSTR bstrText = ::SysAllocStringByteLen("Test",4); </p><p>　　方法二，使用COleVariant或_variant_t。例如：</p><p>//COleVariant strVar("This is a test"); <br />_variant_t strVar("This is a test"); <br />BSTR bstrText = strVar.bstrVal; </p><p>　　方法三，使用_bstr_t，这是一种最简单的方法。例如：</p><p>BSTR bstrText = _bstr_t("This is a test"); </p><p>　　方法四，使用CComBSTR。例如：</p><p>BSTR bstrText = CComBSTR("This is a test"); </p><p>　　或</p><p>CComBSTR bstr("This is a test"); <br />BSTR bstrText = bstr.m_str; </p><p>　　方法五，使用ConvertStringToBSTR。例如：</p><p>char* lpszText = "Test"; <br />BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText); </p><p>　　(5) CString转换成BSTR</p><p>　　通常是通过使用CStringT::AllocSysString来实现。例如：</p><p>CString str("This is a test"); <br />BSTR bstrText = str.AllocSysString(); <br />… <br />SysFreeString(bstrText); // 用完释放  </p><p>　　(6) BSTR转换成CString</p><p>　　一般可按下列方法进行：</p><p>BSTR bstrText = ::SysAllocString(L"Test"); <br />CStringA str; <br />str.Empty(); <br />str = bstrText;  </p><p>　　或</p><p>CStringA str(bstrText); </p><p>　　(7) ANSI、Unicode和宽字符之间的转换</p><p>　　方法一，使用MultiByteToWideChar将ANSI字符转换成Unicode字符，使用WideCharToMultiByte将Unicode字符转换成ANSI字符。</p><p>　　方法二，使用“_T”将ANSI转换成“一般”类型字符串，使用“L”将ANSI转换成Unicode，而在托管C++环境中还可使用S将ANSI字符串转换成String*对象。例如：</p><p>TCHAR tstr[] = _T("this is a test"); <br />wchar_t wszStr[] = L"This is a test"; <br />String* str = S”This is a test”; </p><p>　　方法三，使用ATL 7.0的转换宏和类。ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类，它具有如图3所示的统一形式：</p><p>　　其中，第一个C表示“类”，以便于ATL 3.0宏相区别，第二个C表示常量，2表示“to”，EX表示要开辟一定大小的缓冲。SourceType和DestinationType可以是A、T、W和OLE，其含义分别是ANSI、Unicode、“一般”类型和OLE字符串。例如，CA2CT就是将ANSI转换成一般类型的字符串常量。下面是一些示例代码：</p><p>LPTSTR tstr= CA2TEX&lt;16&gt;("this is a test"); <br />LPCTSTR tcstr= CA2CT("this is a test"); <br />wchar_t wszStr[] = L"This is a test"; <br />char* chstr = CW2A(wszStr);  </p><p>　　六、结语</p><p>　　几乎所有的程序都要用到字符串，而Visual C++.NET由于功能强大、应用广泛，因而字符串之间的转换更为频繁。本文几乎涉及到目前的所有转换方法。当然对于.NET框架来说，还可使用Convert和Text类进行不同数据类型以及字符编码之间的相互转换。<br /><br /><a href="http://www.cnblogs.com/justin/archive/2005/03/24/125057.html"><font color="#1d58d1">http://www.cnblogs.com/justin/archive/2005/03/24/125057.html</font></a></p><img src ="http://www.cppblog.com/huahit/aggbug/10185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huahit/" target="_blank">无为斋</a> 2006-07-18 11:21 <a href="http://www.cppblog.com/huahit/articles/10185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些常用的算法[转] </title><link>http://www.cppblog.com/huahit/articles/10177.html</link><dc:creator>无为斋</dc:creator><author>无为斋</author><pubDate>Tue, 18 Jul 2006 01:42:00 GMT</pubDate><guid>http://www.cppblog.com/huahit/articles/10177.html</guid><wfw:comment>http://www.cppblog.com/huahit/comments/10177.html</wfw:comment><comments>http://www.cppblog.com/huahit/articles/10177.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huahit/comments/commentRss/10177.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huahit/services/trackbacks/10177.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [转：http://www.programfan.com/blog/article.asp?id=5788]																																																																																																 																															...&nbsp;&nbsp;<a href='http://www.cppblog.com/huahit/articles/10177.html'>阅读全文</a><img src ="http://www.cppblog.com/huahit/aggbug/10177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huahit/" target="_blank">无为斋</a> 2006-07-18 09:42 <a href="http://www.cppblog.com/huahit/articles/10177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在MFC中实现自定义的消息发送  zz</title><link>http://www.cppblog.com/huahit/articles/10178.html</link><dc:creator>无为斋</dc:creator><author>无为斋</author><pubDate>Tue, 18 Jul 2006 01:42:00 GMT</pubDate><guid>http://www.cppblog.com/huahit/articles/10178.html</guid><wfw:comment>http://www.cppblog.com/huahit/comments/10178.html</wfw:comment><comments>http://www.cppblog.com/huahit/articles/10178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huahit/comments/commentRss/10178.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huahit/services/trackbacks/10178.html</trackback:ping><description><![CDATA[
		<div class="postbody">
				<p>1。在stdafx.h 中<br /><font color="#ff1493">    static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");<br /></font>2。在框架中<br /><font color="#ff1493"> CView *p = GetActiveView();</font></p>
				<p>
						<font color="#ff1493"> p-&gt;PostMessage(WM_MY_MESSAGE,(WPARAM)3,0);<br /></font>3。在试图中<br /><br />afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);<br />WPARAM W1;<br />LPARAM L1;<br />ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage)</p>
				<p>LRESULT CMFCApplicationView::OnMyMessage(WPARAM w,LPARAM l)<br />{<br /> CRect rect;<br /> GetClientRect(&amp;rect);<br /> InvalidateRect(&amp;rect);<br /> test=!test;<br /> W1 = w;<br /> L1= l;<br /> return 0;<br />}</p>
		</div>
<img src ="http://www.cppblog.com/huahit/aggbug/10178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huahit/" target="_blank">无为斋</a> 2006-07-18 09:42 <a href="http://www.cppblog.com/huahit/articles/10178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>