CStringintstringcharBSTR之间的转换.docx

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

CStringintstringcharBSTR之间的转换.docx

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

CStringintstringcharBSTR之间的转换.docx

CStringintstringcharBSTR之间的转换

一.CString,int,string,char*之间的转换

string转CString

CString.Format("%s",string.c_str());

char转CString

CString.Format("%s",char*);

char转string

strings(char*);

string转char*

char*p=string.c_str();

CString转string

strings(CString.GetBuffer());

1.string->CString

CString.Format("%s",string.c_str());

用c_str()确实比data()要好.

2.char->string

strings(char*);

你的只能初始化,在不是初始化的地方最好还是用assign().

3.CString->string

strings(CString.GetBuffer());

GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.

《C++标准函数库》中:

有三个函数可以将字符串的内容转换为字符数组和C—string

1.data(),返回没有”\0“的字符串数组

2.c_str(),返回有”\0“的字符串数组

3.copy()

CString和int互转

将字符转换为整数,可以使用atoi、_atoi64或atol.

将数字转换为CString变量,可以使用CString的Format函数。

(1)CStrings;

inti=64;

s.Format("%d",i)

Format函数的功能很强,值得你研究一下。

(2)voidCStrDlg:

:

OnButton1()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

CStringss="1212.12";

inttemp=atoi(ss);//字符转换为整数

CStringaa;

aa.Format("%d",temp);//整数转换为字符

AfxMessageBox("varis"+aa);

}

CString和char*互转

(1)char*->CString

CStringstrtest;

char*charpoint;

charpoint="givestringavalue";

strtest=charpoint;

(2)CString->char*

charpoint=strtest.GetBuffer(strtest.GetLength());

标准C里没有string,char*==char[]==string

可以用CString.Format("%s",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;

inti=64;

s.Format("%d",i)

CStringss="1212.12";

inttemp=atoi(ss);

CStringaa;

aa.Format("%d",temp);

如果是使用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函数。

例如:

BSTRbstrText=:

:

SysAllocString(L"Test");

BSTRbstrText=:

:

SysAllocStringLen(L"Test",4);

BSTRbstrText=:

:

SysAllocStringByteLen("Test",4);

方法二:

使用COleVariant或_variant_t。

例如:

COleVariantstrVar("Thisisatest");

_variant_tstrVar("Thisisatest");

BSTRbstrText=strVar.bstrVal;

方法三,使用_bstr_t,这是一种最简单的方法。

例如:

BSTRbstrText=_bstr_t("Thisisatest");

方法四,使用CComBSTR。

例如:

BSTRbstrText=CComBSTR("Thisisatest");

或CComBSTRbstr("Thisisatest");

BSTRbstrText=bstr.m_str;

方法五,使用ConvertStringToBSTR。

例如:

char*lpszText="Test";

BSTRbstrText=_com_util:

:

ConvertStringToBSTR(lpszText);

CString转换成BSTR

通常是通过使用CStringT:

:

AllocSysString来实现。

例如:

CStringstr("Thisisatest");

BSTRbstrText=str.AllocSysString();

SysFreeString(bstrText);//用完释放

BSTR转换成CString

一般可按下列方法进行:

BSTRbstrText=:

:

SysAllocString(L"Test");

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"Thisisatest";

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>("thisisatest");

LPCTSTRtcstr=CA2CT("thisisatest");

wchar_twszStr[]=L"Thisisatest";

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("Thisisatest");//直接构造

COleVariantv2="Thisisatest";

//结果是VT_BSTR类型,值为"Thisisatest"

COleVariantv3((long)2002);

COleVariantv4=(long)2002;

//结果是VT_I4类型,值为2002

_variant_t是一个用于COM的VARIANT类,它的功能与COleVariant相似。

不过在VisualC++.NET的MFC应用程序中使用时需要在代码文件前面添加下列两句:

  #include"comutil.h"

  #pragmacomment(lib,"comsupp.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,"HelloWorld");

CComBSTRbstr5(OLESTR("Heythere"));

CComBSTRbstr6("Heythere");

CComBSTRbstr7(bstr6);//构造时复制,内容为"Heythere"

_bstr_t是是C++对BSTR的封装,它的构造和析构函数分别调用SysAllocString和SysFreeString函数,其他操作是借用BSTRAPI函数。

与_variant_t相似,使用时也要添加comutil.h和comsupp.lib。

五.BSTR、char*和CString转换

(1)char*转换成CString

若将char*转换成CString,除了直接赋值外,还可使用CString:

:

Format进行。

例如:

charchArray[]="Thisisatest";

char*p="Thisisatest";

或:

LPSTRp="Thisisatest";

或在已定义Unicode应的用程序中:

TCHAR*p=_T("Thisisatest");

或:

LPTSTRp=_T("Thisisatest");

CStringtheString=chArray;

theString.Format(_T("%s"),chArray);

theString=p;

(2)CString转换成char*

若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:

方法一.使用强制转换。

例如:

CStringtheString("Thisisatest");

LPTSTRlpsz=(LPTSTR)(LPCTSTR)theString;

方法二.使用strcpy。

例如:

CStringtheString("Thisisatest");

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,"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;

(4)char*转换成BSTR

方法一.使用SysAllocString等API函数。

例如:

BSTRbstrText=:

:

SysAllocString(L"Test");

BSTRbstrText=:

:

SysAllocStringLen(L"Test",4);

BSTRbstrText=:

:

SysAllocStringByteLen("Test",4);

方法二.使用COleVariant或_variant_t。

例如:

//COleVariantstrVar("Thisisatest");

_variant_tstrVar("Thisisatest");

BSTRbstrText=strVar.bstrVal;

方法三.使用_bstr_t,这是一种最简单的方法。

例如:

BSTRbstrText=_bstr_t("Thisisatest");

方法四.使用CComBSTR。

例如:

BSTRbstrText=CComBSTR("Thisisatest");

或CComBSTRbstr("Thisisatest");

BSTRbstrText=bstr.m_str;

方法五.使用ConvertStringToBSTR。

例如:

char*lpszText="Test";

BSTRbstrText=_com_util:

:

ConvertStringToBSTR(lpszText);

(5)CString转换成BSTR

通常是通过使用CStringT:

:

AllocSysString来实现。

例如:

CStringstr("Thisisatest");

BSTRbstrText=str.AllocSysString();

SysFreeString(bstrText);//用完释放

(6)BSTR转换成CString

一般可按下列方法进行:

BSTRbstrText=:

:

SysAllocString(L"Test");

CStringAstr;

str.Empty();

str=bstrText;

或CStringAstr(bstrText);

(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