CStringintstringcharBSTR之间的转换Word下载.docx

上传人:b****7 文档编号:22451455 上传时间:2023-02-04 格式:DOCX 页数:23 大小:26.22KB
下载 相关 举报
CStringintstringcharBSTR之间的转换Word下载.docx_第1页
第1页 / 共23页
CStringintstringcharBSTR之间的转换Word下载.docx_第2页
第2页 / 共23页
CStringintstringcharBSTR之间的转换Word下载.docx_第3页
第3页 / 共23页
CStringintstringcharBSTR之间的转换Word下载.docx_第4页
第4页 / 共23页
CStringintstringcharBSTR之间的转换Word下载.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

CStringintstringcharBSTR之间的转换Word下载.docx

《CStringintstringcharBSTR之间的转换Word下载.docx》由会员分享,可在线阅读,更多相关《CStringintstringcharBSTR之间的转换Word下载.docx(23页珍藏版)》请在冰豆网上搜索。

CStringintstringcharBSTR之间的转换Word下载.docx

%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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1