COM字符串(BSTR)和.NET字符串有什么区别?

6

这是不是只是将字节组合起来“编码”数据的方式?

我很好奇,因为我想知道RCW如何自动将.NET字符串转换为COM BSTR。我猜它只是从.NET字符串形成一个有效的COM BSTR。

相关问题:我能否使用.NET中的byte类型构造自己的有效BSTR?

1个回答

10

这两种字符串类型没有关联。必须进行转换才能将一种类型转换为另一种类型。

BSTR具有许多约定,例如必须通过SysAllocString *分配、使用SysFreeString解除分配、带有长度前缀和以两个空字符结尾的终止符等。

http://msdn.microsoft.com/en-us/library/ms221069.aspx

.Net字符串是一种托管类型,通过托管堆分配。其生存期由CLR垃圾回收器管理。

要构建自己的BSTR,最好使用Marshal.StringToBSTR:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.stringtobstr.aspx

如果这不够好,您可以使用pinvoke SysAllocString:

http://msdn.microsoft.com/en-us/library/ms221458.aspx


谢谢joncham。非常有帮助。我猜我只是想知道如果我检查位和字节会有什么区别。它们都被存储在某个地方。它们都代表着某个东西。它们只是不同的位和字节来表示同样的东西(一串字符)吗? - richard
2
是的,所有的数据都只是字节 ;-). 问题在于谁分配/释放这些字节,以及布局这些字节时使用的约定。例如,当分配BSTR时,您实际上并没有检索到指向分配内存开头的指针。您的指针位于分配空间的4个字节处,因为前四个字节存储字符串的长度。 - joncham
@Richard DesLonde:没错,它们都是字符数组。然而,你不能真正使用任何字符字符串作为System.String,因为任何构造函数都会将字符数组复制到另一个内存位置。 - codekaizen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接