COM中的BSTR详解:从简介到内部结构

2星 需积分: 9 11 下载量 185 浏览量 更新于2024-08-02 收藏 181KB DOC 举报
"BSTR详解.doc" BSTR,全称为"Basic String",是微软在COM(Component Object Model)和OLE(Object Linking and Embedding)中定义的一种标准字符串数据类型,主要用于不同编程语言之间进行互操作。在C++中,BSTR被广泛使用,其在Windows头文件`wtypes.h`中被定义为宽字符(`wchar_t`)类型的指针。 **BSTR的内部结构:** BSTR字符串以特殊的格式存储,它包含了以下几个关键部分: 1. **长度前缀**:BSTR的前4个字节存储了字符串的字节数,这个长度不包含结束的NULL字符。由于BSTR是Unicode字符串,每个字符占用2字节,因此字符串的字符数是字节数的一半。 2. **字符数组**:长度前缀之后是一系列的OLECHAR(等同于`WCHAR`,即宽字符),这是一个以NULL字符结尾的数组。OLECHAR是一个16位的字符类型,能够支持Unicode编码,允许处理各种代码页。 3. **结束的NULL字符**:和C风格的字符串一样,BSTR也以NULL字符(`'\0'`)作为字符串的结束标识。 **BSTR的优势:** BSTR的设计使得它能够在不同的编程环境中方便地传递和使用。由于带有长度前缀,它允许字符串中包含NULL字符,这是传统的C++字符串所不能做到的。此外,由于它是Unicode编码,可以处理多语言环境,提高了字符串处理的兼容性。 **BSTR的管理:** 为了管理BSTR,COM提供了两个重要的API函数: 1. **SysAllocString**:这个函数用于分配新的BSTR,接受一个`OLECHAR*`类型的Unicode字符串作为参数,返回一个新的BSTR。它会计算字符串的长度,包括NULL字符,并在内存中分配适当的空间。 2. **SysReallocString**:这个函数用于重新分配已有的BSTR,如果需要改变BSTR的大小,可以使用此函数。它接受一个现有的BSTR和新的Unicode字符串长度,然后调整BSTR的大小以适应新长度。 需要注意的是,这两个函数都会自动处理内存的分配和释放,因此在使用BSTR时,必须使用这些函数来确保内存管理的正确性,避免内存泄漏。 **与OLECHAR数组的交互:** 由于BSTR的长度信息存储在前4个字节,而OLECHAR数组的前两个字符也在这个位置,所以在C++中直接操作BSTR的内存可能会导致混淆。为了解决这个问题,COM提供了一套API,如`SysAllocStringLen`、`SysFreeString`等,用于创建、修改和释放BSTR,这些函数会正确处理BSTR的长度前缀和字符数据。 总结来说,BSTR是COM中用于跨语言通信的关键数据类型,它的设计考虑了Unicode的支持和字符串中NULL字符的处理,通过特定的内存管理和API,确保了在多种编程环境下高效、安全的字符串操作。