COM-методы, тип Char и CharSetC#

Место общения программистов C#
Ответить
Anonymous
 COM-методы, тип Char и CharSet

Сообщение Anonymous »

Это продолжение моего предыдущего вопроса: копирует ли взаимодействие .NET данные массива туда и обратно или закрепляет массив?

Мой метод — это метод интерфейса COM (а не метод DllImport). Подпись C# выглядит следующим образом:

Код: Выделить всё

void Next(ref int pcch,
[In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)]
char [] pchText);
MSDN сообщает:


Когда управляемый тип 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»