[转]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) *p = _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[]){
58
BSTR bstrText = ::SysAllocString(L"Test");
59
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
60
SysFreeString(bstrText); // 用完释放
61
delete[] lpszText2;
62
return 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转换2

3
(1) char*转换成CString4

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) *p = _T('\0');48
s.ReleaseBuffer();49
// 使用完后及时释放,以便能使用其它的CString成员函数50

51
(3) BSTR转换成char*52

53
方法一,使用ConvertBSTRToString。例如:54

55
#include56
#pragma comment(lib, "comsupp.lib")57
int _tmain(int argc, _TCHAR* argv[]){58
BSTR bstrText = ::SysAllocString(L"Test");59
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);60
SysFreeString(bstrText); // 用完释放61
delete[] lpszText2;62
return 0;63
} 64

65
方法二,使用_bstr_t的赋值运算符重载。例如:66

67
_bstr_t b = bstrText;68
char* lpszText2 = b;69

70
(4) char*转换成BSTR71

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转换成BSTR103

104
通常是通过使用CStringT::AllocSysString来实现。例如:105

106
CString str("This is a test");107
BSTR bstrText = str.AllocSysString();108
…109
SysFreeString(bstrText); // 用完释放 110

111
(6) BSTR转换成CString112

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 转换成short144

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



浙公网安备 33010602011771号