CStringintstringcharBSTR之间的转换Word下载.docx
- 文档编号:22451455
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:23
- 大小:26.22KB
CStringintstringcharBSTR之间的转换Word下载.docx
《CStringintstringcharBSTR之间的转换Word下载.docx》由会员分享,可在线阅读,更多相关《CStringintstringcharBSTR之间的转换Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
%d"
i)
Format函数的功能很强,值得你研究一下。
(2)voidCStrDlg:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringss="
1212.12"
;
inttemp=atoi(ss);
//字符转换为整数
CStringaa;
aa.Format("
temp);
//整数转换为字符
AfxMessageBox("
varis"
+aa);
}
CString和char*互转
(1)char*->
CStringstrtest;
char*charpoint;
charpoint="
givestringavalue"
strtest=charpoint;
(2)CString->
char*
charpoint=strtest.GetBuffer(strtest.GetLength());
标准C里没有string,char*==char[]==string
可以用CString.Format("
char*)这个方法来将char*转成CString。
要把CString转成char*,用操作符(LPCSTR)CString就可以了。
CString->
char[100]
chara[100];
CStringstr("
aaaaaa"
);
strncpy(a,(LPCTSTR)str,sizeof(a));
CString类型的转换成int
(1)CString类型的转换成int,可以使用atoi、_atoi64或atol。
例:
CStringaaa="
16"
;
intint_chage=atoi((lpcstr)aaa);
(2)将数字转换为CString变量,可以使用CString的Format函数。
CStrings;
如果是使用char数组,也可以使用sprintf函数。
数字->
字符串除了用CString:
Format,还有FormatV、sprintf和不需要借助于Afx的itoa
string->
char*
stringaa("
aaa"
char*c=aa.c_str();
注:
1.string.c_str()只能转换成constchar*:
constchar*c=aa.c_str();
2.cannotconvertfrom'
constchar*'
to'
char*'
3.要转成char*这样写:
stringmngName;
chart[200];
memset(t,0,200);
strcpy(t,mngName.c_str());
BSTR转换成char*
方法一:
使用ConvertBSTRToString。
例如:
#include#pragmacomment(lib,"
comsupp.lib"
)
int_tmain(intargc,_TCHAR*argv[])
{
BSTRbstrText=:
SysAllocString(L"
Test"
char*lpszText2=_com_util:
ConvertBSTRToString(bstrText);
SysFreeString(bstrText);
//用完释放
delete[]lpszText2;
return0;
}
方法二:
使用_bstr_t的赋值运算符重载。
_bstr_tb=bstrText;
char*lpszText2=b;
char*转换成BSTR
使用SysAllocString等API函数。
SysAllocStringLen(L"
4);
SysAllocStringByteLen("
使用COleVariant或_variant_t。
COleVariantstrVar("
Thisisatest"
_variant_tstrVar("
BSTRbstrText=strVar.bstrVal;
方法三,使用_bstr_t,这是一种最简单的方法。
BSTRbstrText=_bstr_t("
方法四,使用CComBSTR。
BSTRbstrText=CComBSTR("
或CComBSTRbstr("
BSTRbstrText=bstr.m_str;
方法五,使用ConvertStringToBSTR。
char*lpszText="
BSTRbstrText=_com_util:
ConvertStringToBSTR(lpszText);
CString转换成BSTR
通常是通过使用CStringT:
AllocSysString来实现。
BSTRbstrText=str.AllocSysString();
…
SysFreeString(bstrText);
BSTR转换成CString
一般可按下列方法进行:
BSTRbstrText=:
CStringAstr;
str.Empty();
str=bstrText;
或CStringAstr(bstrText);
ANSI、Unicode和宽字符之间的转换
使用MultiByteToWideChar将ANSI字符转换成Unicode字符,
使用WideCharToMultiByte将Unicode字符转换成ANSI字符。
使用“_T”将ANSI转换成“一般”类型字符串,使用“L”将ANSI转换成Unicode
在托管C++环境中还可使用S将ANSI字符串转换成String*对象。
TCHARtstr[]=_T("
thisisatest"
wchar_twszStr[]=L"
String*str=S”Thisisatest”;
方法三:
使用ATL7.0的转换宏和类。
ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类:
其中,第一个C表示“类”,以便于ATL3.0宏相区别,第二个C表示常量,2表示“to”,EX表示要开辟一定大小的缓冲。
SourceType和DestinationType可以是A、T、W和OLE,其含义分别是ANSI、Unicode、“一般”类型和OLE字符串。
CA2CT就是将ANSI转换成一般类型的字符串常量。
下面是一些示例代码:
LPTSTRtstr=CA2TEX<
16>
("
LPCTSTRtcstr=CA2CT("
char*chstr=CW2A(wszStr);
二.VC字符串转换(BSTRCString)
一.BSTR、LPSTR和LPWSTR
在VisualC++.NET的所有编程方式中,我们常常要用到这样的一些基本字符串类型,如BSTR、LPSTR和LPWSTR等。
之所以出现类似上述的这些数据类型,是因为不同编程语言之间的数据交换以及对ANSI、Unicode和多字节字符集(MBCS)的支持。
那么什么是BSTR、LPSTR以及LPWSTR呢?
1.BSTR(BasicSTRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。
它被描述成一个与自动化相兼容的类型。
由于操作系统提供相应的API函数(如SysAllocString)来管理它以及一些默认的调度代码,因此BSTR实际上就是一个COM字符串,但它却在自动化技术以外的多种场合下得到广泛使用。
2.LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型。
LPSTR被定义成是一个指向以NULL(‘\0’)结尾的8位ANSI字符数组指针,而LPWSTR是一个指向以NULL结尾的16位双字节字符数组指针。
在VC++中,还有类似的字符串类型,如LPTSTR、LPCTSTR等。
例如,LPCTSTR是指“longpointertoaconstantgenericstring”,表示“一个指向一般字符串常量的长指针类型”,与C/C++的constchar*相映射,而LPTSTR映射为char*。
一般地,还有下列类型定义:
#ifdefUNICODE
typedefLPWSTRLPTSTR;
typedefLPCWSTRLPCTSTR;
#else
typedefLPSTRLPTSTR;
typedefLPCSTRLPCTSTR;
#endif
二.CString、CStringA和CStringW
VisualC++.NET中将CStringT作为ATL和MFC的共享的“一般”字符串类,它有CString、CStringA和CStringW三种形式,分别操作不同字符类型的字符串。
这些字符类型是TCHAR、char和wchar_t。
TCHAR在Unicode平台中等同于WCHAR(16位Unicode字符),在ANSI中等价于char。
wchar_t通常定义为unsignedshort。
由于CString在MFC应用程序中经常用到,这里不再重复。
三、VARIANT、COleVariant和_variant_t
在OLE、ActiveX和COM中,VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。
下面让我们来看看OAIDL.H文件中VARIANT定义的一个简化版:
structtagVARIANT{
VARTYPEvt;
union{
shortiVal;
//VT_I2.
longlVal;
//VT_I4.
floatfltVal;
//VT_R4.
doubledblVal;
//VT_R8.
DATEdate;
//VT_DATE.
BSTRbstrVal;
//VT_BSTR.
…
short*piVal;
//VT_BYREF|VT_I2.
long*plVal;
//VT_BYREF|VT_I4.
float*pfltVal;
//VT_BYREF|VT_R4.
double*pdblVal;
//VT_BYREF|VT_R8.
DATE*pdate;
//VT_BYREF|VT_DATE.
BSTR*pbstrVal;
//VT_BYREF|VT_BSTR.
};
};
显然,VARIANT类型是一个C结构,它包含了一个类型成员vt、一些保留字节以及一个大的union类型。
例如,如果vt为VT_I2,那么我们可以从iVal中读出VARIANT的值。
同样,当给一个VARIANT变量赋值时,也要先指明其类型。
VARIANTva;
VariantInit(&
va);
//初始化
inta=2002;
va.vt=VT_I4;
//指明long数据类型
va.lVal=a;
//赋值
为了方便处理VARIANT类型的变量,Windows还提供了这样一些非常有用的函数:
VariantInit——将变量初始化为VT_EMPTY;
VariantClear——消除并初始化VARIANT;
VariantChangeType——改变VARIANT的类型;
VariantCopy——释放与目标VARIANT相连的内存并复制源VARIANT。
COleVariant类是对VARIANT结构的封装。
它的构造函数具有极为强大大的功能,当对象构造时首先调用VariantInit进行初始化,然后根据参数中的标准类型调用相应的构造函数,并使用VariantCopy进行转换赋值操作,当VARIANT对象不在有效范围时,它的析构函数就会被自动调用,由于析构函数调用了VariantClear,因而相应的内存就会被自动清除。
除此之外,COleVariant的赋值操作符在与VARIANT类型转换中为我们提供极大的方便。
例如下面的代码:
COleVariantv1("
//直接构造
COleVariantv2="
//结果是VT_BSTR类型,值为"
COleVariantv3((long)2002);
COleVariantv4=(long)2002;
//结果是VT_I4类型,值为2002
_variant_t是一个用于COM的VARIANT类,它的功能与COleVariant相似。
不过在VisualC++.NET的MFC应用程序中使用时需要在代码文件前面添加下列两句:
#include"
comutil.h"
#pragmacomment(lib,"
)
四.CComBSTR和_bstr_t
CComBSTR是对BSTR数据类型封装的一个ATL类,它的操作比较方便。
CComBSTRbstr1;
bstr1="
Bye"
//直接赋值
OLECHAR*str=OLESTR("
tata"
//长度为5的宽字符
CComBSTRbstr2(wcslen(str));
//定义长度为5
wcscpy(bstr2.m_str,str);
//将宽字符串复制到BSTR中
CComBSTRbstr3(5,OLESTR("
HelloWorld"
));
CComBSTRbstr4(5,"
CComBSTRbstr5(OLESTR("
Heythere"
CComBSTRbstr6("
CComBSTRbstr7(bstr6);
//构造时复制,内容为"
_bstr_t是是C++对BSTR的封装,它的构造和析构函数分别调用SysAllocString和SysFreeString函数,其他操作是借用BSTRAPI函数。
与_variant_t相似,使用时也要添加comutil.h和comsupp.lib。
五.BSTR、char*和CString转换
(1)char*转换成CString
若将char*转换成CString,除了直接赋值外,还可使用CString:
Format进行。
charchArray[]="
char*p="
或:
LPSTRp="
或在已定义Unicode应的用程序中:
TCHAR*p=_T("
LPTSTRp=_T("
CStringtheString=chArray;
theString.Format(_T("
),chArray);
theString=p;
(2)CString转换成char*
若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:
方法一.使用强制转换。
CStringtheString("
);
LPTSTRlpsz=(LPTSTR)(LPCTSTR)theString;
方法二.使用strcpy。
LPTSTRlpsz=newTCHAR[theString.GetLength()+1];
_tcscpy(lpsz,theString);
需要说明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是constwchar_t*(Unicode)或constchar*(ANSI),系统编译器将会自动对其进行转换。
方法三.使用CString:
GetBuffer。
CStrings(_T("
Thisisatest"
LPTSTRp=s.GetBuffer();
//在这里添加使用p的代码
if(p!
=NULL)*p=_T('
\0'
s.ReleaseBuffer();
//使用完后及时释放,以便能使用其它的CString成员函数
(3)BSTR转换成char*
方法一.使用ConvertBSTRToString。
#include
#pragmacomment(lib,"
int_tmain(intargc,_TCHAR*argv[])
char*lpszText2=_com_util:
delete[]lpszText2;
return0;
方法二.使用_bstr_t的赋值运算符重载。
(4)char*转换成BSTR
方法一.使用SysAllocString等API函数。
方法二.使用COleVariant或_variant_t。
//COleVariantstrVar("
方法三.使用_bstr_t,这是一种最简单的方法。
方法四.使用CComBSTR。
方法五.使用ConvertStringToBSTR。
(5)CString转换成BSTR
(6)BSTR转换成CString
(7)ANSI、Unicode和宽字符之间的转换
方法一.使用MultiByteToWideChar将ANSI字符转换成Unicode字符,使用WideCharToMultiByte将Unicode字符转换成ANSI字符。
方法二.使用“_T”将ANSI转换成“一般”类型字符串,使用“L”将ANSI转换成Unicode,而在托管C++环境中还可使用S将ANSI字符串转换成String*对象。
TCH
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CStringintstringcharBSTR 之间 转换
![提示](https://static.bdocx.com/images/bang_tan.gif)