数据结构域算法设计-VC字符串之间的转换

上传人:woxinch****an2018 文档编号:39298310 上传时间:2018-05-14 格式:DOCX 页数:30 大小:67.10KB
返回 下载 相关 举报
数据结构域算法设计-VC字符串之间的转换_第1页
第1页 / 共30页
数据结构域算法设计-VC字符串之间的转换_第2页
第2页 / 共30页
数据结构域算法设计-VC字符串之间的转换_第3页
第3页 / 共30页
数据结构域算法设计-VC字符串之间的转换_第4页
第4页 / 共30页
数据结构域算法设计-VC字符串之间的转换_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《数据结构域算法设计-VC字符串之间的转换》由会员分享,可在线阅读,更多相关《数据结构域算法设计-VC字符串之间的转换(30页珍藏版)》请在金锄头文库上搜索。

1、字符串的转换字符串转换用到的地方很多,常见的字符串类型有以下几种:char wchar tchar BSTR _bstr_t CComBSTR CString string。最常涉及到的是在BSTR 和 CString 之间相互转换。1.字符串的根本及其封装其实最基本的字符或串,深究到底,只有三种:字符字符串说明charLPSTR LPCSTR单字节,以 0 标记结束wchar_tLPWSTR LPWCSTR双字节,以 0 标记结束BSTR双字节,前面有 4 个 byte 长,用来装 字节数。这表明一个 BSTR 串可能包含多个 0而至于以下的封装,其目的多是对其中一种进行封装,并提供了转入和

2、转出的接口。而封装的方式分为两条线,unicode 方式和 com 方式。Windows 的兼容 UNICODE 封装字符字符串说明charLPSTR LPCSTRAnsi 单字节wchar_tLPWSTR LPWCSTRUnicode 双字节TCHARLPTSTR LPCTSTRCString兼容 Ansi 和 unicode 的Windows 的兼容 com 封装分支字符串说明通用标准BSTR多用在 IDL 中,作为标准接口对外兼容各类语 言的使用者com c+_bstr_t多用在 c+ 的实现和使用,既有 MFC 也有标准 C+包含 comdef.h OLEAUT32.LIB OLEAU

3、T32.dllAtlCComBSTR多用在 atl 的组件实现和使用方面,包含 atlbase.h atl.lib atl.dllunicode 和 com 有很大的相同-都是双字节。MS 将组件的通用字符串类型定义为双字节了。BSTR 前进的第一步是双字节;前进的另一步是字符串长度的解决方法。以 0 结尾的通用的字符串解决方式简单明了;但是在那内存寸土寸金的年代,讲求速度、最大化发挥软件的功能和效率,为所有字符串都省去求长这一步,在最简单的地方前进一步,产生的收益却是无穷大。2. 字符串的转换转换与使用的场合相结合。总结如下场合分支字符串说明MFCCStringMFC 对兼容 unicode

4、 的封装通用标准BSTRIDL 中使用com c+_bstr_t多用在使用组件时,非 MFC 程序也可以使用。_bstr_t 实际上是将 char wchar_t BSTR 转换为 wchar_t*;同时又可以转换为 char wchar_t BSTR注意:里面的转换函数使用的是标准 c+ AtlCComBSTR多用在 atl 的组件实现和使用方面,CcomBSTR 实际上是也是将非 BSTR 转换为 BSTR 的副本但不支持转换为其它非 BSTR 类型注意:里面的转换函数使用的是 win api说明: BSTR 实际上可以直接作为 wchat_t * 来使用。3 BSTR 简介COM 是一种

5、跨编程语言的平台,需要提供语言无关的数据类型。多数编程语言有自己的字符串表示。C+ 字符串是以 0 结束的 ASCII 或 Unicode 字符数组Visual Basic 字符串是一个 ASCII 字符数组加上表示长度的前缀。Java 字符串是以 0 结束的 Unicode 字符数组。需要定义一种通用的字符串类型,可以很容易的匹配到不同编程语言。在 C+中,就是 BSTR。BSTR 是“Basic STRing“的简称,微软在 COM/OLE 中定义的标准字符串数据类型。对于C+,Windows 头文件 wtypes.h 中定义如下:typedef wchar_t WCHAR;typedef

6、 WCHAR OLECHAR;typedef OLECHAR _RPC_FAR *BSTR;在 COM 中,字符用 16-bit OLECHAR 表示,这样使 COM 可以支持各种code pages,包括 Unicode。对于 windows 系统,可以简单理解为OLECHAR 使用的就是 Unicode 。OLECHAR 串与单字节字符串很类似,是一个以 null 结尾的 buffer。唯一的区别是每个字符占两个字节,而不是一个0 1 2 3 4 5 6 7 8 9 0 1| H | E | L | L | O | /0| OLCHAR使用以 Null 结尾的简单字符串在 COM comp

7、onent 间传递不太方便。因此,标准 BSTR 是一个有长度前缀和 null 结束符的 OLECHAR 数组。BSTR的前 4 字节是一个表示字符串长度的前缀。BSTR 长度域的值是字符串的字节数,并且不包括 0 结束符。由于是 Unicode 串,所以字符数是字节数的一半。这种方式的优点是允许程序员在 BSTR 串中间嵌入 NULL 字符。但是,BSTR的前四个字节表示长度,而 OLECHAR 数组的前四字节表示前两个字符。这种情况下,对于 C+程序,如何实现 BSTR 和 OLECHAR 的交换?答案是 COM提供了两个 BSTR 分配用的 API:SysAllocString / Sy

8、sReallocString。函数返回的指针指向 BSTR 的第一个字符,而不是 BSTR 在内存的第一个字节。0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 50a000000 | H | E | L | L | O | /0| BSTR下面是 SysAllocString 和 SysFreeString 的伪代码。BSTR SimpleSysAllocString( const OLECHAR * sz)if ( sz = NULL) return NULL;BYTE* buf = new BYTEsizeof(INT32) + (wcslen(sz)+1)*sizeof(OL

9、ECHAR) ;if(buf = NULL)return NULL;elseINT32 len = wcslen(sz) * sizeof(OLECHAR);*(INT32*) buf) = len;wcscpy( (WCHAR*)(buf+sizeof(INT32), sz);return (BSTR)(buf+sizeof(INT32);VOID SimpleSysFreeString( BSTR bstr)if(bstr != NULL)BYTE* start = (BYTE*)bstr - sizeof(INT32);delete start;BSTR 只有在你不得不用的时候才应该使用

10、。使用 BSTR 一般有以下几种情况:COM interface 接口定义,并且不希望额外提供 custom marshaling 库(MDIL 生成或开发人员自己订制),必须使用 BSTR传递字符串。使用 C/C+类型的字符串在 COM DLL 传递字符串,表面上可以使用,但违背了 COM 的基本规则,并且给以后的扩展留下了隐患。例如,把一个 In-process COM Object(简单说 COM DLL)改成 out-of-process object(COM EXE)。理论上,客户端的代码应该不做任何改变。但如果是用了 C/C+字符串,又希望只使用系统的 automation mas

11、haller(Oleaut32.dll),就会出错。如果可以提供 custom marshaling,也推荐使用 BSTR。客户要求接口必须使用 BSTR,和客户讨论后,不能修改。使用的外部库的接口使用 BSTR不使用的情况:不推荐在 IDL 结构体中定义 BSTR 成员,会给结构体的复制和释放带来麻烦。最好直接使用限定最大长度的 TCHAR 数组。如果确实需要传递变长字符串,BSTR 应该被定义成独立的参数或者使用独立的get/set 接口。尽可能缩小的 BSTR 及相关类型的作用域范围。类的成员变量和函数参数不使用 BSTR。局部变量要尽快释放类的内部不使用 BSTR。代码处理逻辑中只在接

12、口直接相关部分使用 BSTR。接收到一个 BSTR时,尽量立刻变成 C/C+的字符串副本进行处理。在需要传递 BSTR参数前产生 BSTR,用过立即释放。字符串相关类型的推荐选择顺序优先 级类型说明最高stl:string/wstring 功能最完善,可移植性最好。CString 如果编码规范限制使用如果编码规范限制使用 STLSTL 的时候,的时候, 推荐推荐 CStringCString。 VC 6 的版本很不完善。.Net 有明显 改进,需要进一步研究。C/C+ basic type(TCHAR* / char* / LPTSTR / LPCTSTR / TCHAR) 在结构体中,优先使

13、用指定最大长度 的字符数组。 效率最好CComBSTR/ _bstr_t 在必须使用 BSTR 时的优先选择。 在 ATL(COM component)工程或者工 程中必须使用 ATL 中,优先选择 CComBSTR。一 般 Exe/dll 如果_bstr_t 能满足要求,优先使 用_bstr_t。 对于 VC6,使用_bstr_t 一定要慎重, 最好只用作简单临时变量保存调被调用函数的 传入参数。因为_bstrt_t 不能支持一些关键性 操作,比如 Detach。 对于 VC+ .Net 推荐使用_bstr_t, 它是 C+扩展,不需要额外包含 ATL 的文件。 最低BSTR COM 接口B

14、STR 的使用规则在对 BSTR 进行读取操作的时候,可以把 BSTR 看作 OLECHAR 数组。BSTR可以用于 const wchar_t*(LPCTSTR/ LPCWSTR/ cosnt TCHAR*/ cosnt WCHAR* in Unicode project),不能用于需要 wchar_t* (LPTSTR/ LPWSTR/ TCHAR*/ WCHAR* in Unicode project)的地方。 如果有相应的 BSTR 处理函数,必须使用 BSTR 处理函数,不要使用普通字符串函数。特别是一个 BSTR 包含多个字符串(也就是,包含多个 0 结束符)的情况。在对 BSTR

15、 进行修改(包括创建和释放时),必须使用 BSTR 的专用函数。主要要保证对字符长度前缀的正确修改。不要直接读取 BSTR 的长度域,应该使用 BSTR 处理函数计算长度。String Manipulation Functions Descriptions SysAllocStringCreates and initializes a string. SysAllocStringByteLenCreates a zero-terminated string of a specified length. SysAllocStringLenCreates a string of a specifi

16、ed length. SysFreeStringFrees a previously created string. SysReAllocStringChanges the size and value of a string. SysReAllocStringLenChanges the size of an existing string. SysStringByteLenReturns the length of a string in bytes. SysStringLenReturns the length of a string.NULL 是 BSTR 的有效值。按照约定,它可以被看作含有 0 个字符的字符串。BSTR

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号