Access Violation при получении строки из pilot_nt.dll

Андрей Седоченко
Дата: 12.12.2019 11:14:52
Добрый всем день!

Вопрос наверное набил оскомину, и большинство может меня отправить в поиск по гуглу. Но есть нюанс.

В приложении нужно получить оплату через сбербанк. В их длл-ке очень простой интерфейс, и все отлично, до тех пор пока не пытаюсь получить текст чека, который передается как lpChar и должен быть освобожден с помощью GlobalFree.
В этот момент получаем Access Violation, но не как обычно по адресу близкому к 0, а по адресу который находится за пределами 3ГБ пользовательского пространства.
Прога компилируется Delphi7, перевод на 64 бита пока невозможен.

Может быть кто-то решал похожую проблему? И доступ к этому участку памяти все же возможен...
alekcvp
Дата: 12.12.2019 11:30:00
Андрей Седоченко,

Если delphi 7, то библиотека явно 32-х битная, иначе бы вы её загрузить не смогли.
Я бы проверил описание импортируемых функций и соглашения о вызове, т.к. возможно что адрес за пределами 3Гб - это мусор, отсюда и AV.
a4sdg
Дата: 12.12.2019 11:38:01
когда использовал эту либу pilot_nt.sberbank
не заметил проблем с получением текста чека
wadman
Дата: 12.12.2019 12:13:15
Андрей Седоченко
который передается как lpChar

Юникодный наверное?
Андрей Седоченко
Дата: 12.12.2019 12:18:01
Самое странное то. что у меня есть старая процедура, которая подгружает библиотеку, делает запрос и получает чек одним куском кода, и она работает. Но изменились требования к интерфейсу и теперь все разнесено по разным процедурам и по времени обращения. После этого стал получать AV.
Андрей Седоченко
Дата: 12.12.2019 12:23:12
a4sdg
когда использовал эту либу pilot_nt.sberbank
не заметил проблем с получением текста чека

Я ее только вчера обнаружил, еще не пробовал. Все попытки были пока что, решить своими силами, но они безуспешны. Но подход из этой либы я еще попробую, т.е. на каждый вызов библиотечной функции делать новую загрузку библиотеки.
DmSer
Дата: 12.12.2019 13:02:24
С такой проблемой мы не сталкивались.
Вы поля структуры TAuthAnswerXXX обнуляете перед вызовом функции "_card_authorizeXXX", или у Вас там мусор? Версию "_card_authorize" какую используете? 14-ю?

Текст чека получить можно таким образом:
s := string(AuthXXX.ans.Check)

Освободить память так:
GlobalFree(DWORD(AuthXXX.ans.Check))
Андрей Седоченко
Дата: 12.12.2019 13:26:35
DmSer,

Все делаю именно так и в такой последовательности. версию _card_authorize использовал без номера и 9.
DmSer
Дата: 12.12.2019 14:15:55
Раз AV возникает, значит все-таки что-то Вы не так делаете.
Функцию "_SetGUIHandles" используете?

Насчёт того, чтобы библиотеку загружать каждый раз заново: мы так и сделали, поскольку в ней есть глюки, программисты Сбера исправить их не смогли (года два мы их просили об этом, то она у них иногда зависает, то СОМ-порты не закрывает), поэтому сделали отдельную программу "2", её запускает основная программа "1", программа "2" выполняет команду и закрывается. Если вдруг программа "2" зависает, то в программе "1" это детектируется и процесс программы "2" убивается.
DmSer
Дата: 12.12.2019 14:37:10
Попробуйте Это
пароль: 2017