Отображение для типа данных BSTR в JNA - PullRequest
0 голосов
/ 07 февраля 2011

в заголовочном файле DLL, которую нужно обернуть, использует тип данных BSTR в качестве параметра ввода / вывода.Мне нужно создать его отображение в JNA.Я нашел следующий пример:

class BSTR extends PointerType {
  public BSTR() { }
  public BSTR(String value) {
    super(new Memory(value.length()*2+6).share(4));  
    getPointer().setInt(-4, value.length()*2);
    getPointer().setString(0, value, true);
 }
 public String toString() {
    int length = getPointer().getInt(-4);
    char[] data = getPointer().getCharArray(0, length/2);
    return new String(data);
 }

}

, но после использования его в вызове метода JNA результат пуст (= длина равна 0 и данных нет).Есть ли у вас какие-либо предложения, как создать правильное отображение для BSTR, чтобы использовать его в качестве параметра ввода / вывода функции?Похоже, что BSTR не передается по ссылке на метод DLL, поэтому результат все еще пуст, но это только мое предположение.Возможно, отображение правильное, но неправильно используется при вызове метода.Заранее благодарен за любое предложение.

1 Ответ

0 голосов
/ 09 февраля 2011

Я не могу найти правильное отображение «Тип для типа», но просто чтобы быть уверенным, можете ли вы попробовать его таким образом и получить строку (длина> 0).

[ Редактировать : см. Комментарий к Technomage]
ВНИМАНИЕ : Вы должны быть намного намного более осторожными при использовании Memory объектов. Они получают free'd на родном уровне, когда java-объект получает garbadge. Это означает, что ваш код super(new Memory(value.length()*2+6).share(4)); является пустой тратой времени, потому что ваш new Memory(..) исчезает в тот самый момент, когда вы проходите линию, поскольку .share(4) дает новый независимый Pointer

class BSTRUtils {
  private BSTR() { }
  public static Memory toNative(String value) {
    Memory m = new Memory(value.length()*2+6);  
    m.setInt(0, value.length()*2);
    m.setString(4, value, true);
    return m;
  }
  public static String toString(PointerByReference pbr) {
    return toString(pbr.getValue());
  }
  public static String toString(Pointer p) {
    int length = p.getInt(0);
    char[] data = p.getCharArray(4, length/2);
    return new String(data);
  }
}
...