Обратный вывод данных из DLL
Столкнулся с проблемой вывода данных из DLL. Есть файл с интерфейсом и вызовом функций (написан на делфи, думаю что DLL так же).
И так, вот есть нижеследующий код с примера на делфи:
{получить назначенное на счёт сообщение}
Function GetAccountMessage( Account: Integer; var Msg: PChar ): BOOL; stdcall;
И реализация моего кода на Java: (передаём номер аккаунта, должны получить строку обратно)
CscLink INSTANCE = (CscLink) Native.loadLibrary("csclink", CscLink.class, W32APIOptions.ASCII_OPTIONS);
boolean GetAccountMessage(int Account, StringByReference Msg);
Далее вызываю в main
StringByReference getAccMsg = new StringByReference();
myLib.GetAccountMessage(getAccNumb.getValue(), getAccMsg);
System.out.println("Сообщение: " + getAccMsg.getValue());
После чего приходит следующий ответ:
4Днk/inPЁХ a
Так же хочу подметить, что вариации этого ответа прилетают всегда разные, но всегда спереди указано 4Д
Пробовал использовать указатели и прочие.
Класс StringByReference реализует перевод поинтера сразу в строку.
Ответы (1 шт):
И так, проблема решена. В комментариях MBo подсказал по поводу двойного указателя, решил проблему следующим образом. Интерфейс:
CscLink INSTANCE = (CscLink) Native.loadLibrary("csclink", CscLink.class, W32APIOptions.ASCII_OPTIONS);
boolean GetAccountMessage(int Account, PointerByReference Msg);
main:
//объявляем переменные
String msg;
Pointer point;
PointerByReference getAccMsg;
//Инициализируем
getAccMsg = new PointerByReference();
//выполняем вызов функции из DLL
myLib.GetAccountMessage(getAccNumb.getValue(), getAccMsg);
//Инициализируем указатель референсным указателем (если так можно назвать)
point = getAccMsg.getValue();
//В строку передаём указатель с вызовом строки и началом памяти
msg = point.getString(0);
После этого в строке msg получаем нужный нам ответ.