资源预览内容
第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
亲,该文档总共4页全部预览完了,如果喜欢就下载吧!
资源描述
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(LI 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);
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号