2011-06-21 62 views
5

只是字节组合来“编码”数据的方式吗?COM字符串(BSTR)和.NET字符串有什么区别?

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

相关:我可以使用.NET中的字节类型构造自己的有效BSTR吗?

回答

9

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

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

+0

感谢joncham 。很有帮助。我想我只是想知道如果我检查了位和字节,这些差异会是什么。他们都存储在某个地方。它们都代表着某种东西他们不只是代表同一事物的不同位和字节(一串字符?) – richard

+2

是的,所有数据都只是字节;-)。问题是谁分配/取消分配这些字节,以及在布置这些字节时使用的约定。例如,在分配一个BSTR时,实际上并不检索指向分配内存开始的指针。由于前四个字节存储字符串的长度,因此您的指针在分配的空间中是4个字节。 – joncham

+0

@Richard DesLonde:是的,他们都是人物阵列。然而,你不能真的使用任何字符串作为'System.String',因为任何'System.String'的构造函数都会将字符数组复制到另一个内存位置。 – codekaizen

相关问题