Передача строки из C # в cpp с COM - PullRequest
3 голосов
/ 24 апреля 2010

У меня есть C # COM-сервер, который используется клиентом cpp.

Один из методов C # возвращает строку.

В cpp возвращаемая строка представлена ​​в Unicode (UTF-16), по крайней мере, в соответствии с представлением памяти.

  1. Всегда ли это так для строк COM?
  2. Есть ли способ использовать вместо UTF-8?
  3. Я видел некоторый код, в котором строки передавались между cpp и c # в виде байтовых массивов. Есть ли в этом какая-то выгода?

Ответы [ 2 ]

1 голос
/ 25 апреля 2010
  1. Да. Стандартный тип строки COM - BSTR. Это строка в кодировке Unicode, закодированная в UTF16, точно так же, как собственный тип строки Windows.
  2. Нет, метод COM не будет понимать строку UTF8, он превратит ее в китайский. UTF8 - хорошая кодировка для текстового файла, а не для программ, управляющих строками в памяти. UTF8 требует от 1 до 4 байтов для кодирования кодовой точки Unicode. Очень несовместимо с основными строковыми манипуляциями, такими как получение размера или индексация символа.
  3. Программы на C и C ++ обычно используют 8-битные кодировки, совместимые с типом "char". Это старая практика, относящаяся ко времени, когда еще не было Unicode. В этом нет ничего привлекательного, есть много 8-битных кодировок. Типичная проблема заключается в том, что данные, введенные в виде текста, могут правильно интерпретироваться, только если они считываются программой, которая использует ту же 8-битную кодировку. Другими словами, когда компьютеры находятся на расстоянии менее 1000 миль друг от друга. Меньше в Европе.
0 голосов
/ 24 апреля 2010
  1. номер
  2. Да. Поставьте атрибут [return: MarshalAs(UnmanagedType.LPStr)] перед определением метода в C #, если вы хотите вернуть строку в виде строки ANSI вместо Unicode.
  3. Да, возможно, автор сделал это, чтобы сохранить очень детальный контроль над кодированием содержимого строки, обходя стандартное поведение маршаллинга.
...