版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、VC 字符串转换所属类别:VC+推荐指数:文档人气:19495本周人气:66发布日期:2006-3-11一、 BSTR 、 LPSTR 和 LPWSTR在 Visual C+.NET的所有编程方式中, 我们常常要用到这样的一些基本字符串类型, 如 BSTR 、 LPSTR 和 LPWSTR 等。之所以出现类似上述的这些数据类型,是因为不同编程语言之间的数据交 换以及对 ANSI 、 Unicode 和多字节字符集 (MBCS的支持。那么什么是 BSTR 、 LPSTR 以及 LPWSTR 呢?BSTR(Basic STRing, Basic 字符串 是一个 OLECHAR*类型的 Unicod
2、e 字符串。 它被描述成一个 与自动化相兼容的类型。由于操作系统提供相应的 API 函数 (如 SysAllocString 来管理它以及一些默 认的调度代码,因此 BSTR 实际上就是一个 COM 字符串,但它却在自动化技术以外的多种场合下 得到广泛使用。图 1描述了 BSTR 的结构,其中 DWORD 值是字符串中实际所占用的字节数,且它 的值是字符串中 Unicode 字符的两倍。LPSTR 和 LPWSTR 是 Win32和 VC+所使用的一种字符串数据类型。 LPSTR 被定义成是一个 指向以 NULL( 0 结尾的 8位 ANSI 字符数组指针,而 LPWSTR 是一个指向以 NU
3、LL 结尾的 16位双字节字符数组指针。在 VC+中,还有类似的字符串类型,如 LPTSTR 、 LPCTSTR 等,它们的 含义如图 2所示。例如, LPCTSTR 是指“ long pointer to a constant generic string” ,表示“一个指向一般字符串常 量的长指针类型” ,与 C/C+的 const char*相映射,而 LPTSTR 映射为 char*。一般地,还有下列类型定义:#ifdef UNICODEtypedef LPWSTR LPTSTR;typedef LPCWSTR LPCTSTR;#elsetypedef LPSTR LPTSTR;typ
4、edef LPCSTR LPCTSTR;#endif二、 CString 、 CStringA 和 CStringWVisual C+.NET中将 CStringT 作为 ATL 和 MFC 的共享的“一般”字符串类,它有 CString 、 CStringA 和 CStringW 三种形式,分别操作不同字符类型的字符串。这些字符类型是 TCHAR 、 char 和 wchar_t。 TCHAR 在 Unicode 平台中等同于 WCHAR(16位 Unicode 字符 , 在 ANSI 中等价于 char 。wchar_t通常定义为 unsigned short。由于 CString 在 M
5、FC 应用程序中经常用到,这里不再重复。 三、 V ARIANT 、 COleVariant 和 _variant_t在 OLE 、 ActiveX 和 COM 中, V ARIANT 数据类型提供了一种非常有效的机制,由于它既包含 了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。下面让我们来 看看 OAIDL.H 文件中 V ARIANT 定义的一个简化版:struct tagVARIANT V ARTYPE vt;union short iVal; / VT_I2.long lVal; / VT_I4.float fltVal; / VT_R4.double db
6、lVal; / 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.;显然, V ARIANT 类型是一个 C 结构,它包含了一个类型成员 vt 、
7、一些保留字节以及一个大的 union 类型。例如,如果 vt 为 VT_I2,那么我们可以从 iVal 中读出 V ARIANT 的值。同样,当给一 个 V ARIANT 变量赋值时,也要先指明其类型。例如:V ARIANT va;: VariantInit(&va; / 初始化int a = 2002;va.vt = VT_I4; / 指明 long 数据类型va.lVal = a; / 赋值为了方便处理 V ARIANT 类型的变量, Windows 还提供了这样一些非常有用的函数:VariantInit 将变量初始化为 VT_EMPTY;VariantClear 消除并初始化 V ARI
8、ANT;VariantChangeType 改变 V ARIANT 的类型 ;VariantCopy 释放与目标 V ARIANT 相连的内存并复制源 VARIANT 。COleVariant 类是对 V ARIANT 结构的封装。它的构造函数具有极为强大大的功能,当对象构造 时首先调用 VariantInit 进行初始化,然后根据参数中的标准类型调用相应的构造函数,并使用 VariantCopy 进行转换赋值操作, 当 V ARIANT 对象不在有效范围时, 它的析构函数就会被自动调用, 由于析构函数调用了 VariantClear , 因而相应的内存就会被自动清除。 除此之外, COleV
9、ariant 的赋值 操作符在与 V ARIANT 类型转换中为我们提供极大的方便。例如下面的代码:COleVariant v1(This is a test; / 直接构造COleVariant v2 = This is a test;/ 结果是 VT_BSTR类型,值为 This is a testCOleVariant v3(long2002;COleVariant v4 = (long2002;/ 结果是 VT_I4类型,值为 2002_variant_t是一个用于 COM 的 V ARIANT 类,它的功能与 COleVariant 相似。不过在 Visual C+.NET的 MFC
10、 应用程序中使用时需要在代码文件前面添加下列两句:#include comutil.h#pragma comment( lib, comsupp.lib 四、 CComBSTR 和 _bstr_tCComBSTR 是对 BSTR 数据类型封装的一个 ATL 类,它的操作比较方便。例如:CComBSTR bstr1;bstr1 = Bye; / 直接赋值OLECHAR* str = OLESTR(ta ta; / 长度为 5的宽字符CComBSTR bstr2(wcslen(str; / 定义长度为 5wcscpy(bstr2.m_str, str; / 将宽字符串复制到 BSTR 中CComB
11、STR 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.li
12、b 。五、 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;theStri
13、ng.Format(_T(%s, chArray;theString = p;(2 CString转换成 char*若将 CString 类转换成 char*(LPSTR类型,常常使用下列三种方法:方法一,使用强制转换。例如:CString theString( This is a test ;LPTSTR lpsz =(LPTSTR(LPCTSTRtheString;方法二,使用 strcpy 。例如:CString theString( This is a test ;LPTSTR lpsz = new TCHARtheString.GetLength(+1;_tcscpy(lpsz, t
14、heString;需要说明的是, 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转换成 cha
15、r*方法一,使用 ConvertBSTRToString 。例如:#include#pragma comment(lib, comsupp.libint _tmain(int argc, _TCHAR* argvBSTR bstrText = :SysAllocString(LTest;char* lpszText2 = _com_util:ConvertBSTRToString(bstrText; SysFreeString(bstrText; / 用完释放delete lpszText2;return 0;方法二,使用 _bstr_t的赋值运算符重载。例如:_bstr_t b = bstr
16、Text;char* lpszText2 = b;(4 char*转换成 BSTR方法一,使用 SysAllocString 等 API 函数。例如: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
17、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
18、_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; (7 ANSI、Unicode 和宽字符之间的转换 方法一, 使用 MultiByteToWideChar 将 ANSI 字符转换成 Unicode 字符, 使用 WideCharToMultiByte 将 Unicode 字符转换成 ANS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 码头区域交通协管员劳动合同
- 2025年安顺货运上岗证模拟考试题
- 市政工程备用电源租赁合同
- 市政道路景观设计服务合同
- 地铁站内铝塑板安装施工协议
- 2024幼儿园保育员突发事件应急处理聘用协议3篇
- 2025年度ROHS环保认证与产品保证合同范本3篇
- 运输费用结算协议
- 跨境电商院落租赁协议
- 城市供热办公楼施工合同
- 物业上门维修收费标准
- ATS技术交流(新型发动机智能恒温节能冷却系统)100318
- 手术区皮肤的消毒和铺巾ppt课件
- 日有所诵(二年级)
- 2022年度培训工作总结
- 应急照明装置安装施工方法
- 静力触探技术标准
- 钢结构、膜结构安全技术交底
- DB34∕T 4057-2021 中小河流防汛特征水位分析规程
- 单肺通气技术
- 学生基本情况分析(通用11篇)
评论
0/150
提交评论