问题描述
|
该过程在这里说明:
http://msdn.microsoft.com/zh-CN/library/d1ae6tz5%28v=VS.80%29.aspx
我从那篇文章中没有得到的是,固定的wchar_t *传递给了各种C字符串函数,这些函数依赖于结尾的空字符。 .NET字符串是否包含尾随空字符是规则? System.String文档说:
在.NET Framework中,可以在字符串中嵌入空字符。当字符串包含一个或多个空字符时,它们将包含在整个字符串的长度中。
解决方法
据我了解,.NET CLR字符串中的内部字符缓冲区是以Null结尾的,尽管自然而然Null字符不会进入字符计数,因此任何.NET代码都将忽略它。存在null的唯一原因是可以轻松与Windows API或其他期望字符串以null终止的普通C代码互操作。无需在必须将.NET字符串传递给C API时附加一个空字符(并且可能不得不重新分配和复制整个字符串),而是从头开始就存在一个空字符-真正有用的优化-world,因为.NET仍然必须在幕后进行大量互操作,即使您没有明确使用它也是如此。
如果您确实在字符串的中间有一些空字符,那么,获取您的字符串的任何C API都可能会在那里停止,并且永远不会到达字符串的末尾。我想您甚至可以自己在C ++ / CLI中尝试一下,看看会发生什么。 :)
,只是猜测,因为我无权访问Microsoft内部。
它没有明确说明,但是wchar_t *字符串应始终以空字符结尾。该示例支持此功能,因为它使用取决于此特性的“ 0”功能。
PtrToStringChars
函数授予对内部字符串缓冲区的访问权限。该函数有可能将一个空字符添加到缓冲区中而不将其包括在字符串的字符计数中,因此该字符串的.NET用户将看不到该空值。