c # — Когда я использую regasm, все параметры вводятся как входные данные? Можно ли это изменить?

Я использую приложение C ++ для вызова c DLL. Regasm превратил мою функцию из двухсимвольных массивов и возвращал int в функцию с двумя BSTR и длинным указателем в качестве параметров. Два BSTR были помечены как входные, и длинный указатель был моим исходным возвращаемым значением. Проблема в том, что один из моих массивов символов был истинным вводом, а другой был информацией об ошибке, возвращаемой из dll. Есть ли идентификатор, позволяющий regasm знать, что мой второй строковый параметр на самом деле является выходным? Во время отладки я проверил, что второй параметр изменялся в dll, но не вернулся к вызывающей функции.

1

Решение

Это действительно нормальное преобразование метода .NET в метод COM. BSTR является стандартным типом взаимодействия строк, он дает очень надежные гарантии того, что строка может быть правильно распределена через границы модуля / языка без больших проблем с управлением памятью. Простая строка превращается в BSTR, строка ref / out превращается в BSTR *, что позволяет передавать новую строку обратно. Почти то же самое для возвращаемого типа, метод COM должен возвращать HRESULT, чтобы указать успех / неудачу, поэтому исходное возвращаемое значение обязательно становится из аргумент в C # говорить.

Вы бы очень неразумно возиться с этим, много способов оторвать ногу. Вы можете применить атрибут [MarshalAs], чтобы использовать другой тип аргумента. [PreserveSig] для подавления преобразования возвращаемого значения. При этом вызов функции больше не может маршалировать через границы квартир. Опять быть очень будьте осторожны с этим, особенно если вы хотите вернуть строки. Это гарантированная проблема управления памятью. Работа с BSTR или возвращаемые значения в C ++ не проблема, вы можете погуглить множество примеров кода.

2

Другие решения


По вопросам рекламы [email protected]