Мой метод — это метод интерфейса COM (а не метод DllImport). Подпись C# выглядит следующим образом:
Код: Выделить всё
void Next(ref int pcch,
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)]
char [] pchText);
Когда управляемый тип Char, который по умолчанию имеет форматирование Unicode,
передается неуправляемому коду, маршалер взаимодействия преобразует набор символов
в ANSI. Вы можете применить атрибут DllImportAttribute к
объявлениям вызова платформы и атрибут StructLayoutAttribute
к объявлению COM-взаимодействия, чтобы контролировать, какой набор символов использует
маршалированный тип Char.
Кроме того, @HansPassant в своем ответе здесь говорит:
Символ [] не может быть маршалирован как LPWStr, он должен быть LPArray. Теперь атрибут
CharSet играет роль, так как вы его не указали,
char[] будет маршалирован как 8-битный char[], а не как 16-битный wchar_t[].
Элемент маршалируемого массива имеет разный размер (он не
"преобразуемый"), поэтому маршаллер должен скопировать массив.
Pretty нежелательно, особенно если учесть, что ваш код C++ ожидает
wchar_t. В этом конкретном случае очень простой способ определить это — не возвращать
ничего обратно в массив. Если массив маршалируется путем копирования, то
вы должны явно сообщить маршаллеру, что массив необходимо
скопировать обратно после вызова. Вам придется применить атрибут [In, Out]
к аргументу. Вы получите китайский язык.
Мне не удалось найти аналог CharSet (обычно используемый с DllImportAttribute и StructLayoutAttribute), который можно было бы применить к методу COM-интерфейса.
Тем не менее, я не получаю на выходе «китайский». Кажется, все работает нормально, я получаю правильные символы Юникода из COM.
Означает ли это, что Char всегда интерпретируется как WCHAR для взаимодействия методов COM?
Я не смог найти никакой документации, подтверждающей или опровергающей это.>
Подробнее здесь: https://stackoverflow.com/questions/250 ... nd-charset
Мобильная версия