使用COM将字符串从C#传递到cpp

3
我有一个被cpp客户端调用的C# COM服务器。
其中一个C#方法返回一个字符串。
在cpp中,返回的字符串是以Unicode(UTF-16)表示的,至少根据内存视图是这样的。
1. 这种情况是否总是发生在COM字符串中?
2. 是否有一种方法可以使用UTF-8代替?
3. 我看到一些代码将字符串作为字节数组在cpp和c#之间传递。这样做有什么好处吗?

这个线程已经变成了一个不吸引人的投票节日,有着相互矛盾的答案。我建议您在MSDN库中查找BSTR和SysAllocString的定义,并得出自己的结论。 - Hans Passant
2个回答

1
  1. 是的。标准的COM字符串类型是BSTR。它是一个Unicode字符串,使用UTF16编码,就像Windows本地字符串类型一样。
  2. 不,COM方法无法理解UTF8字符串,它会将其转换成中文。UTF8是文本文件的良好编码方式,但不适用于操作内存中的字符串的程序。UTF8需要1到4个字节来编码一个Unicode代码点。这与基本的字符串操作(如获取大小或索引字符)非常不兼容。
  3. C和C++程序倾向于使用与“char”类型兼容的8位编码。这是一种旧的做法,追溯到Unicode出现之前的时代。它没有任何吸引力,有许多8位编码。典型的问题是,只有在使用相同的8位编码的程序读取时,才能正确解释以文本形式输入的数据。换句话说,当计算机距离不到1000英里时。在欧洲更少。

听起来好像你搞反了。他是从C++调用一个C# COM组件。 - sblom
@sblom:是的,你的回答让我感到困惑。COM 在两端看起来都是一样的。自动化始终支持 Unicode。 - Hans Passant

0
  1. 不。
  2. 是的。如果您想将字符串作为 ANSI 字符串而不是 Unicode 返回,请在 C# 中的方法定义之前放置 属性 [return: MarshalAs(UnmanagedType.LPStr)]
  3. 是的——作者可能这样做是为了通过规避默认的封送行为来保持对字符串内容编码的非常细粒度的控制。

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