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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163
