P / Вызвать BSTR из неуправляемого кода

#.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.