_bstr_t 类型,BSTR类型和CString类型到底有什么区别

数据结构 专栏收录该内容
4 篇文章 0 订阅

原文地址:http://wenku.baidu.com/view/803cf42258fb770bf78a557d.html


bstr_t类型到底是类型呢?用的时候也可以直接_bstr_t bstr="abcd";  还可以  
_bstr_t bstr="abcd";  
CString str=(char *)bstr;//_bstr_t莫非是指针?指针可以赋常量字符串?  我在ADO数据库编程中用如下语句:  
CString str=(m_RecordSet->GetCollect("Name")).bstrVal;//m_RecordSet是_RecordsetPtr类型  
(m_RecordSet->GetCollect("Name")).bstrVal是BSTR类型  
说明BSTR可以直接赋给CString类型,从编译器中得知BSTR是unsigned short*类型,怎么可以直接赋给CString对象呢?  
实在不清楚这三个的本质区别,请高手指点!  
 
网友回复:CString str=(char *)bstr;//_bstr_t莫非是指针?指针可以赋常量字符串?\   
_bstr_t有这几个成员   
operator const wchar_t*( ) const throw( );  operator wchar_t*( ) const throw( );  operator const char*( ) const;  operator char*( ) const;  
 
网友回复:我搜集的资料:May this can help you.   
7.关于CString和其他一些自动化类型的相互转换问题.  未参考的资源: 在各种字符串类型之间进行转换  http://msdn2.microsoft.com/zh-cn/library/ms235631.aspx  类型类别:CString ,VARIANT,BSTR,_t_btr,等  
预备知识:  
BSTR:根据MSDN,他的内部结构为:4字节的长度前缀(字节单位),字符串(宽),2字节结束标志0x0000.平常的BSTR是指向字符串的第一字节,并非前缀.比如定义BSTR myBstr=L” I am a happy BSTR”,这样其实不正确,并没有正确生成前缀.应该这样: BSTR MyBstr = SysAllocString(L"I am a happy BSTR");这样就会在内存分配时就会加上前缀和结束标志.  
 
BSTR(Basic STRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。它被描述成一个与自动化相兼容的类型。 
 
_bstr_t: _bstr_t是C 对BSTR的封装,它的构造和析构函数分别调用SysAllocString和SysFreeString函数,其他操作是借用BSTR API函数。与_variant_t相似,使用时也要添加comutil.h和comsupp.lib  
CComBSTR: CComBSTR是对BSTR数据类型封装的一个ATL类.  CComBSTR bstr1;  
bstr1 = "Bye"; // 直接赋值  
OLECHAR* str = OLESTR("ta ta"); // 长度为5的宽字符  CComBSTR bstr2(wcslen(str)); // 定义长度为5  






wcscpy(bstr2.m_str, str); // 将宽字符串复制到BSTR中  CComBSTR bstr3(5, OLESTR("Hello World"));  CComBSTR bstr4(5, "Hello World");    
CComBSTR bstr5(OLESTR("Hey there"));  CComBSTR bstr6("Hey there");  
CComBSTR bstr7(bstr6);  VARIANT,_variant_t  
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。  
参考如下代码:  
_variant_t:  
long l=222; ing i=100; _variant_t lVal(l); lVal = (long)i;  
COleVariant:  COleVariant v3 = "字符串", v4 = (long)1999; CString str =(BSTR)v3.pbstrVal;  long i = v4.lVal;    
// 构造时复制,内容为"Hey there"  
 
(1).BSTR和CString的相互转换  
BSTR->CString :BSTR可直接赋值给CString.cstring=myBstr  CString->BSTR: myBstr=cstring.AllocSysString();  (2)char * 和BSTR  Char * ->BSTR:  
char * pChar="Hello!";  
BSTR myBstr=_com_util::ConvertStringToBSTR(pChar);  
::SysFreeString(myBstr);//这个函数作用后myBstr仍存在,还可赋值给cstring,令人费解.  BSTR->char *:  
char *p=_com_util::ConvertBSTRToString(myBstr);  delete p;//指针delete后还可访问,只是只想的是乱码.  
(3)char *和_bstr_t,  
Char * ->_bstr_t: 1.直接赋值:如_bstr_t bstr;char * pChar=”hello!”;2.pChar作为_bstr_t的构造参数:char * pChar=”Hello!”;_bstr_t bstr(pChar);  
_bstr_t-> char *:_bstr_t bstr char *pChar=(LPTSTR)bstr  (4)_bst_t和BSTR  
_bstr_t->BSTR:BSTR操作符.  
BSTR->_bstr_t:_bstr_t的构造函数.  (5) CComBSTR:  
内部有BSTR类型的公有成员m_str.  To char:  
LPCTSTR操作符  To BSTR:  






BSTR操作符  
To _bstr_t:  
先使用BSTR操作符或直接取其m_str成员, 作为_bstr_t的构造函数  
 
由于CComBSTR中的数据成员BSTR m_str公开, 而且重载了&操作符, 适合作为以BSTR作 为传出参数的函数, 但要注重内存泄漏问题, 不要将已赋值的CComBSTR作为传出参数  
  (6) VARIANT, CString , _variant_t,这个只举几个小例子:  CString 放到VARIANT 中:  CString temp=”Aloha”;  variant.vt=VT_BSTR;   
 
variant.bstrVal=temp.AllocSysString();//似乎这里的CString包含的是宽字符.   
VARIANT 到CString  
CString=(LPCTSTR)(_bstr_t)_variant_t    
(7)CString,Int Char *,float  
----------------------------------------------------------------------------------------------------------------------  
Char * ? Int: atoi();这里涉及到一些细节:转换在碰到非法字符时停下,并保留已经转换的值 ,比如”1asd”转换后返回1,”asd”返回0,也就是没有转换。  
CString->Int:  
Int- >CString: int n=atoi(str.GetBuffer(0));  
函数原型: int atoi(  
const char *str  
); 返回值为转换结果。,若无法转换,则返回0.   
CString temp;  
Temp.Format(“%d”,nTemp);   
Int?Char *:  
转换函数原型: char *_itoa(  int value,  char *string,  int radix  
);  
radix :Base of value; must be in the range 2 – 36. 进制数.十进制就是10.  
----------------------------------------------------------------------------------------------------------------------  






 
CString ? Float :  
float f=atof(str.GetBuffer(0));  Float?CString:  str.Format("%f",f);

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值