Обратный вывод данных из DLL

Рейтинг: 0Ответов: 1Опубликовано: 20.03.2023

Столкнулся с проблемой вывода данных из 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

Так же хочу подметить, что вариации этого ответа прилетают всегда разные, но всегда спереди указано Пробовал использовать указатели и прочие.
Класс StringByReference реализует перевод поинтера сразу в строку.

Ответы

▲ 2Принят

И так, проблема решена. В комментариях 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 получаем нужный нам ответ.