#.net #vb.net #pinvoke
#.net #vb.net #pinvoke
Вопрос:
Какой должна быть подпись VB для неуправляемой функции void PopulateBSTR(исходящая строка BSTR)?
Функция PopulateBSTR выполняет SysAllocString и заполняет строку. Обратите внимание, что неуправляемая подпись имеет аргумент BSTR, а не BSTR*. Я могу маршалировать строку BSTR, используя подпись IntPtr, когда подпись C содержит BSTR * в качестве аргумента.
(Неуправляемый код — это внешняя библиотека dll, которую я не могу изменить, но мне нужно использовать.)
Комментарии:
1. Не существует сценария, в котором допустимо возвращать строку через переданный аргумент BSTR (вместо BSTR*). Этот устаревший код мог сработать только случайно, хотя совершенно неясно, как этот самолет приземлился, не превратившись в огненный шар. Вам не повезло такого рода.
2. @Hans совершенно прав. Вам нужно вернуться к основам и разобраться, что происходит на самом деле.
Ответ №1:
Глядя на PInvoke.net похоже, вам нужно использовать атрибут MarshallAs, чтобы указать, что его следует рассматривать как BSTR
.
Ответ №2:
Необходимо указать CharSet = CharSet.Unicode
в списке атрибутов dllimport
. Используйте его как StringBuilder
, а не как класс string.