欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年字符串转换借鉴 .pdf

    • 资源ID:34257741       资源大小:54.23KB        全文页数:6页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年字符串转换借鉴 .pdf

    字符串转换_BSTR/LPSTR/LPWSTR/Char 一、BSTR 、LPSTR 和 LPWSTR 在 Visual C+.NET 的所有编程方式中,我们常常要用到这样的一些基本字符串类型,如BSTR 、LPSTR 和 LPWSTR 等。之所以出现类似上述的这些数据类型,是因为不同编程语言之间的数据交换以及对 ANSI 、Unicode 和多字节字符集 (MBCS) 的支持。那么什么是 BSTR 、LPSTR 以及 LPWSTR 呢?BSTR(Basic STRing,Basic 字符串 )是一个 OLECHAR*类型的 Unicode 字符串。它被描述成一个与自动化相兼容的类型。 由于操作系统提供相应的API 函数(如 SysAllocString)来管理它以及一些默认的调度代码, 因此 BSTR 实际上就是一个 COM 字符串,但它却在自动化技术以外的多种场合下得到广泛使用。图 1 描述了 BSTR 的结构,其中 DWORD值是字符串中实际所占用的字节数,且它的值是字符串中Unicode 字符的两倍。LPSTR 和 LPWSTR 是 Win32和 VC+ 所使用的一种字符串数据类型。LPSTR 被定义成是一个指向以NULL( 0)结尾的 8 位 ANSI字符数组指针,而LPWSTR 是一个指向以 NULL结尾的 16 位双字节字符数组指针。在 VC+ 中,还有类似的字符串类型,如LPTSTR 、LPCTSTR 等,它们的含义如图2 所示。例如, LPCTSTR 是指“long pointer to a constant generic string”,表示“一个指向一般字符串常量的长指针类型”,与C/C+的 const char*相映射,而 LPTSTR 映射为 char* 。一般地,还有下列类型定义:#ifdef UNICODE typedef LPWSTR LPTSTR; typedef LPCWSTR LPCTSTR; #else typedef LPSTR LPTSTR; typedef LPCSTR LPCTSTR; #endif 二、CString 、CStringA 和 CStringW Visual C+.NET 中将 CStringT 作为 ATL和 MFC 的共享的“一般”字符串类,它有CString 、CStringA 和 CStringW 三种形式,分别操作不同字符类型的字符串。这些字符类型是TCHAR 、char 和wchar_t 。 TCHAR 在 Unicode 平台中等同于 WCHAR(16 位 Unicode 字符) , 在 ANSI中等价于 char 。 wchar_t通常定义为 unsigned short。由于 CString 在 MFC 应用程序中经常用到,这里不再重复。三、VARIANT 、COleVariant 和_variant_t 在 OLE 、ActiveX 和 COM 中,VARIANT 数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。下面让我们来看看OAIDL.H文件中 VARIANT 定义的一个简化版:struct tagVARIANT VARTYPE vt; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - union short iVal; / VT_I2. long lVal; / VT_I4. float fltVal; / VT_R4. double dblVal; / VT_R8. DATE date; / VT_DATE. BSTR bstrVal; / 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变量赋值时,也要先指明其类型。例如:VARIANT va; : VariantInit(&va); / 初始化int a = 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 类型转换中为我们提供极大的方便。例如下面的代码:COleVariant v1(This is a test); / 直接构造COleVariant v2 = This is a test; / 结果是 VT_BSTR 类型,值为 This is a test COleVariant v3(long)2002); COleVariant v4 = (long)2002; / 结果是 VT_I4 类型,值为 2002 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - _variant_t是一个用于 COM 的 VARIANT 类, 它的功能与 COleVariant 相似。 不过在 Visual C+.NET的 MFC 应用程序中使用时需要在代码文件前面添加下列两句:#include comutil.h #pragma comment( lib, comsupp.lib ) 四、CComBSTR和_bstr_t 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); / 构造时复制,内容为 Hey there _bstr_t是是 C+ 对 BSTR 的封装, 它的构造和析构函数分别调用SysAllocString和 SysFreeString函数, 其他操作是借用 BSTR API 函数。 与_variant_t相似, 使用时也要添加 comutil.h和 comsupp.lib 。五、BSTR 、char* 和 CString 转换(1) char*转换成 CString 若将 char* 转换成 CString ,除了直接赋值外,还可使用CString:Format进行。例如:char chArray = This is a test; char * p = This is a test; 或LPSTR p = This is a test; 或在已定义 Unicode 应的用程序中TCHAR * p = _T(This is a test); 或LPTSTR p = _T(This is a test); CString theString = chArray; theString.Format(_T(%s), chArray); theString = p; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - (2) CString转换成 char* 若将 CString 类转换成 char*(LPSTR) 类型,常常使用下列三种方法:方法一,使用强制转换。例如:CString theString( This is a test ); LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString; 方法二,使用 strcpy 。例如:CString theString( This is a test ); LPTSTR lpsz = new TCHARtheString.GetLength()+1; _tcscpy(lpsz, theString); 需要说明的是, strcpy( 或可移值 Unicode/MBCS的_tcscpy) 的第二个参数是 const wchar_t* (Unicode) 或 const char* (ANSI),系统编译器将会自动对其进行转换。方法三,使用 CString:GetBuffer。例如:CString s(_T(This is a test ); LPTSTR p = s.GetBuffer(); / 在这里添加使用p 的代码if(p != NULL) *p = _T(0); s.ReleaseBuffer(); / 使用完后及时释放,以便能使用其它的CString 成员函数(3) BSTR 转换成 char* 方法一,使用 ConvertBSTRToString 。例如:#include comutil.h #pragma comment(lib, comsupp.lib) int _tmain(int argc, _TCHAR* argv) BSTR bstrText = :SysAllocString(LTest); char* lpszText2 = _com_util:ConvertBSTRToString(bstrText); SysFreeString(bstrText); / 用完释放delete lpszText2; return 0; 方法二,使用 _bstr_t的赋值运算符重载。例如:_bstr_t b = bstrText; char* lpszText2 = b; (4) char*转换成 BSTR 方法一,使用 SysAllocString等 API 函数。例如:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - BSTR bstrText = :SysAllocString(LTest); BSTR bstrText = :SysAllocStringLen(LTest,4); BSTR bstrText = :SysAllocStringByteLen(Test,4); 方法二,使用 COleVariant 或_variant_t。例如:/COleVariant strVar(This is a test); _variant_t strVar(This is a test); BSTR bstrText = strVar.bstrVal; 方法三,使用 _bstr_t ,这是一种最简单的方法。例如:BSTR bstrText = _bstr_t(This is a test); 方法四,使用 CComBSTR。例如:BSTR bstrText = CComBSTR(This is a test); 或CComBSTR bstr(This is a test); BSTR bstrText = bstr.m_str; 方法五,使用 ConvertStringToBSTR 。例如:char* lpszText = Test; BSTR bstrText = _com_util:ConvertStringToBSTR(lpszText); (5) CString转换成 BSTR 通常是通过使用 CStringT:AllocSysString来实现。例如:CString str(This is a test); BSTR bstrText = str.AllocSysString(); ,SysFreeString(bstrText); / 用完释放(6) BSTR 转换成 CString 一般可按下列方法进行:BSTR bstrText = :SysAllocString(LTest); CStringA str; str.Empty(); str = bstrText; 或CStringA str(bstrText); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - (7) ANSI 、Unicode 和宽字符之间的转换方法一, 使用 MultiByteToWideChar 将 ANSI字符转换成 Unicode 字符, 使用 WideCharToMultiByte将 Unicode 字符转换成 ANSI字符。方法二,使用“ _T”将 ANSI转换成“一般”类型字符串,使用“L”将 ANSI转换成 Unicode,而在托管 C+ 环境中还可使用 S将 ANSI字符串转换成 String* 对象。例如:TCHAR tstr = _T(this is a test); wchar_t wszStr = LThis is a test; Stri ng* str = S”This is a test”;方法三,使用 ATL 7.0 的转换宏和类。 ATL7.0 在原有 3.0 基础上完善和增加了许多字符串转换宏以及提供相应的类,它具有如图3 所示的统一形式:其中,第一个 C表示“类”,以便于ATL 3.0 宏相区别,第二个C表示常量, 2 表示“to ”, EX表示要开辟一定大小的缓冲。SourceType 和 DestinationType可以是 A、T、W和 OLE ,其含义分别是ANSI、Unicode、“一般”类型和OLE字符串。例如, CA2CT 就是将 ANSI转换成一般类型的字符串常量。下面是一些示例代码:LPTSTR tstr= CA2TEX(this is a test); LPCTSTR tcstr= CA2CT(this is a test); wchar_t wszStr = LThis is a test; char* chstr = CW2A(wszStr); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -

    注意事项

    本文(2022年字符串转换借鉴 .pdf)为本站会员(C****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开