﻿<?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++博客-单摆心的空灵</title><link>http://www.cppblog.com/136342755/</link><description>空灵</description><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:08:11 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:08:11 GMT</pubDate><ttl>60</ttl><item><title># VC常用数据类型使用转换详解 [转] </title><link>http://www.cppblog.com/136342755/archive/2011/05/09/146053.html</link><dc:creator>VC爱好者</dc:creator><author>VC爱好者</author><pubDate>Mon, 09 May 2011 13:58:00 GMT</pubDate><guid>http://www.cppblog.com/136342755/archive/2011/05/09/146053.html</guid><wfw:comment>http://www.cppblog.com/136342755/comments/146053.html</wfw:comment><comments>http://www.cppblog.com/136342755/archive/2011/05/09/146053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/136342755/comments/commentRss/146053.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/136342755/services/trackbacks/146053.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;&nbsp; </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>}&nbsp; </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>&#8230; <br>SysFreeString(bstrText); // 用完释放&nbsp; </p>
<p>　　(6) BSTR转换成CString</p>
<p>　　一般可按下列方法进行：</p>
<p>BSTR bstrText = ::SysAllocString(L"Test"); <br>CStringA str; <br>str.Empty(); <br>str = bstrText;&nbsp; </p>
<p>　　或</p>
<p>CStringA str(bstrText); </p>
<p>　　(7) ANSI、Unicode和宽字符之间的转换</p>
<p>　　方法一，使用MultiByteToWideChar将ANSI字符转换成Unicode字符，使用WideCharToMultiByte将Unicode字符转换成ANSI字符。</p>
<p>　　方法二，使用&#8220;_T&#8221;将ANSI转换成&#8220;一般&#8221;类型字符串，使用&#8220;L&#8221;将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&#8221;This is a test&#8221;; </p>
<p>　　方法三，使用ATL 7.0的转换宏和类。ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类，它具有如图3所示的统一形式：</p>
<p>　　其中，第一个C表示&#8220;类&#8221;，以便于ATL 3.0宏相区别，第二个C表示常量，2表示&#8220;to&#8221;，EX表示要开辟一定大小的缓冲。SourceType和DestinationType可以是A、T、W和OLE，其含义分别是ANSI、Unicode、&#8220;一般&#8221;类型和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);&nbsp; </p>
<p>　　六、结语</p>
<p>　　几乎所有的程序都要用到字符串，而Visual C++.NET由于功能强大、应用广泛，因而字符串之间的转换更为频繁。本文几乎涉及到目前的所有转换方法。当然对于.NET框架来说，还可使用Convert和Text类进行不同数据类型以及字符编码之间的相互转换。<br><br></p>
<img src ="http://www.cppblog.com/136342755/aggbug/146053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/136342755/" target="_blank">VC爱好者</a> 2011-05-09 21:58 <a href="http://www.cppblog.com/136342755/archive/2011/05/09/146053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC常用数据类型使用转换详解 zz </title><link>http://www.cppblog.com/136342755/archive/2011/05/09/146052.html</link><dc:creator>VC爱好者</dc:creator><author>VC爱好者</author><pubDate>Mon, 09 May 2011 13:55:00 GMT</pubDate><guid>http://www.cppblog.com/136342755/archive/2011/05/09/146052.html</guid><wfw:comment>http://www.cppblog.com/136342755/comments/146052.html</wfw:comment><comments>http://www.cppblog.com/136342755/archive/2011/05/09/146052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/136342755/comments/commentRss/146052.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/136342755/services/trackbacks/146052.html</trackback:ping><description><![CDATA[<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/136342755/aggbug/146052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/136342755/" target="_blank">VC爱好者</a> 2011-05-09 21:55 <a href="http://www.cppblog.com/136342755/archive/2011/05/09/146052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>