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

jackson35296 2008-05-28 04:42:14
_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对象呢?
实在不清楚这三个的本质区别,请高手指点!
...全文
553 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
eliteGoblin 2008-05-28
  • 打赏
  • 举报
回复
有关CString的讲解见VCKBase 上的CString 操作指南

eliteGoblin 2008-05-28
  • 打赏
  • 举报
回复
我搜集的资料: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_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);
  • 打赏
  • 举报
回复
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;

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧