[转]BSTR、char*和CString short转换

  1  BSTR、 char * 和CString short转换
  2
  3   ( 1 char * 转换成CString
  4
  5   若将char * 转换成CString,除了直接赋值外,还可使用CString::Format进行。例如:
  6
  7 char  chArray[]  =   " This is a test " ;
  8 char   *  p  =   " This is a test " ;
  9
 10   或
 11
 12 LPSTR p  =   " This is a test " ;
 13
 14   或在已定义Unicode应的用程序中
 15
 16 TCHAR  *  p  =  _T( " This is a test " );
 17
 18   或
 19
 20 LPTSTR p  =  _T( " This is a test " );
 21 CString theString  =  chArray;
 22 theString.Format(_T( " %s " ), chArray);
 23 theString  =  p;
 24
 25   ( 2 ) CString转换成char *
 26
 27   若将CString类转换成char * (LPSTR)类型,常常使用下列三种方法:
 28
 29   方法一,使用强制转换。例如:
 30
 31 CString theString(  " This is a test "  );
 32 LPTSTR lpsz  = (LPTSTR)(LPCTSTR)theString; 
 33
 34   方法二,使用strcpy。例如:
 35
 36 CString theString(  " This is a test "  );
 37 LPTSTR lpsz  =   new  TCHAR[theString.GetLength() + 1 ];
 38 _tcscpy(lpsz, theString);
 39
 40   需要说明的是,strcpy(或可移值Unicode / MBCS的_tcscpy)的第二个参数是  const  wchar_t *  (Unicode)或const  char *  (ANSI),系统编译器将会自动对其进行转换。
 41
 42   方法三,使用CString::GetBuffer。例如:
 43
 44 CString s(_T( " This is a test  " ));
 45 LPTSTR p  =  s.GetBuffer();
 46 //  在这里添加使用p的代码
 47 if (p  !=  NULL)  * =  _T( ' \0 ' );
 48 s.ReleaseBuffer();
 49 //  使用完后及时释放,以便能使用其它的CString成员函数
 50
 51   ( 3 ) BSTR转换成char *
 52
 53   方法一,使用ConvertBSTRToString。例如:
 54
 55 #include
 56 #pragma  comment(lib, "comsupp.lib")
 57 int  _tmain( int  argc, _TCHAR *  argv[]) {
 58BSTR bstrText = ::SysAllocString(L"Test");
 59char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
 60SysFreeString(bstrText); // 用完释放
 61delete[] lpszText2;
 62return 0;
 63}
 
 64
 65   方法二,使用_bstr_t的赋值运算符重载。例如:
 66
 67 _bstr_t b  =  bstrText;
 68 char *  lpszText2  =  b;
 69
 70   ( 4 char * 转换成BSTR
 71
 72   方法一,使用SysAllocString等API函数。例如:
 73
 74 BSTR bstrText  =  ::SysAllocString(L " Test " );
 75 BSTR bstrText  =  ::SysAllocStringLen(L " Test " , 4 );
 76 BSTR bstrText  =  ::SysAllocStringByteLen( " Test " , 4 );
 77
 78   方法二,使用COleVariant或_variant_t。例如:
 79
 80 // COleVariant strVar("This is a test");
 81 _variant_t strVar( " This is a test " );
 82 BSTR bstrText  =  strVar.bstrVal;
 83
 84   方法三,使用_bstr_t,这是一种最简单的方法。例如:
 85
 86 BSTR bstrText  =  _bstr_t( " This is a test " );
 87
 88   方法四,使用CComBSTR。例如:
 89
 90 BSTR bstrText  =  CComBSTR( " This is a test " );
 91
 92   或
 93
 94 CComBSTR bstr( " This is a test " );
 95 BSTR bstrText  =  bstr.m_str;
 96
 97   方法五,使用ConvertStringToBSTR。例如:
 98
 99 char *  lpszText  =   " Test " ;
100 BSTR bstrText  =  _com_util::ConvertStringToBSTR(lpszText);
101
102   ( 5 ) CString转换成BSTR
103
104   通常是通过使用CStringT::AllocSysString来实现。例如:
105
106 CString str( " This is a test " );
107 BSTR bstrText  =  str.AllocSysString();
108
109 SysFreeString(bstrText);  //  用完释放 
110
111   ( 6 ) BSTR转换成CString
112
113   一般可按下列方法进行:
114
115 BSTR bstrText  =  ::SysAllocString(L " Test " );
116 CStringA str;
117 str.Empty();
118 str  =  bstrText; 
119
120   或
121
122 CStringA str(bstrText);
123
124   ( 7 ) ANSI、Unicode和宽字符之间的转换
125
126   方法一,使用MultiByteToWideChar将ANSI字符转换成Unicode字符,使用WideCharToMultiByte将Unicode字符转换成ANSI字符。
127
128   方法二,使用“_T”将ANSI转换成“一般”类型字符串,使用“L”将ANSI转换成Unicode,而在托管C ++ 环境中还可使用S将ANSI字符串转换成String * 对象。例如:
129
130 TCHAR tstr[]  =  _T( " this is a test " );
131 wchar_t wszStr[]  =  L " This is a test " ;
132 String *  str  =  S”This  is  a test”;
133
134   方法三,使用ATL  7 .0的转换宏和类。ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类,它具有如图3所示的统一形式:
135
136   其中,第一个C表示“类”,以便于ATL  3 .0宏相区别,第二个C表示常量,2表示“to”,EX表示要开辟一定大小的缓冲。SourceType和DestinationType可以是A、 T、W和OLE,其含义分别是ANSI、Unicode、“一般”类型和OLE字符串。例如,CA2CT就是将ANSI转换成一般类型的字符串常量。下面是一些示例代码:
137
138 LPTSTR tstr =  CA2TEX < 16 > ( " this is a test " );
139 LPCTSTR tcstr =  CA2CT( " this is a test " );
140 wchar_t wszStr[]  =  L " This is a test " ;
141 char *  chstr  =  CW2A(wszStr); 
142
143   char  转换成short
144
145 int    atoi( char     * nptr)   将字符串nptr转换成整型数,   并返回这个数,错误返回0    
146    
147    char     * num    =     " 123 " ;  
148   unsigned    short    a;  
149    
150    
151   a    =    (unsigned    short )   atoi(num)   ;  
152    
153   就是这样了  
154    
155    
156    
157    
158   类似的函数还有:  
159    
160    long    atol( char     * nptr)   将字符串nptr转换成长整型数,并返回这个数,错误返回0    
161    
162    double    atof( char     * nptr)   将字符串nptr转换成双精度数,并返回这个数,错误返回0 
163

你可能感兴趣的:([转]BSTR、char*和CString short转换)