powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Access Violation при получении строки из pilot_nt.dll
24 сообщений из 24, страница 1 из 1
Access Violation при получении строки из pilot_nt.dll
    #39901735
Добрый всем день!

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

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

Может быть кто-то решал похожую проблему? И доступ к этому участку памяти все же возможен...
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39901749
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Седоченко,

Если delphi 7, то библиотека явно 32-х битная, иначе бы вы её загрузить не смогли.
Я бы проверил описание импортируемых функций и соглашения о вызове, т.к. возможно что адрес за пределами 3Гб - это мусор, отсюда и AV.
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39901753
a4sdg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
когда использовал эту либу pilot_nt.sberbank
не заметил проблем с получением текста чека
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39901780
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Седоченко
который передается как lpChar

Юникодный наверное?
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39901782
Самое странное то. что у меня есть старая процедура, которая подгружает библиотеку, делает запрос и получает чек одним куском кода, и она работает. Но изменились требования к интерфейсу и теперь все разнесено по разным процедурам и по времени обращения. После этого стал получать AV.
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39901784
a4sdg
когда использовал эту либу pilot_nt.sberbank
не заметил проблем с получением текста чека

Я ее только вчера обнаружил, еще не пробовал. Все попытки были пока что, решить своими силами, но они безуспешны. Но подход из этой либы я еще попробую, т.е. на каждый вызов библиотечной функции делать новую загрузку библиотеки.
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39901809
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С такой проблемой мы не сталкивались.
Вы поля структуры TAuthAnswerXXX обнуляете перед вызовом функции "_card_authorizeXXX", или у Вас там мусор? Версию "_card_authorize" какую используете? 14-ю?

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

Освободить память так:
GlobalFree(DWORD(AuthXXX.ans.Check))
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39901818
DmSer,

Все делаю именно так и в такой последовательности. версию _card_authorize использовал без номера и 9.
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39901854
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз AV возникает, значит все-таки что-то Вы не так делаете.
Функцию "_SetGUIHandles" используете?

Насчёт того, чтобы библиотеку загружать каждый раз заново: мы так и сделали, поскольку в ней есть глюки, программисты Сбера исправить их не смогли (года два мы их просили об этом, то она у них иногда зависает, то СОМ-порты не закрывает), поэтому сделали отдельную программу "2", её запускает основная программа "1", программа "2" выполняет команду и закрывается. Если вдруг программа "2" зависает, то в программе "1" это детектируется и процесс программы "2" убивается.
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39901878
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте Это
пароль: 2017
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39901918
DmSer,

Попробую, обязательно. Спасибо.
Я говорил уже, что у меня есть процедура, которая работает без ошибок, просто я больше не могу ее использовать потому что надо разделить библиотечные вызовы по времени.

Может быть все дело в том что я добавил обертку к библиотечной функции примерно вот таким способом
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function card_authorize(var Auth: TAuthAnswerXXX):integer;
begin
  if CheckLibLoaded then
  if Assigned(_CardAuthorizeXXX) then
    result:= _CardAuthorizeXXX(nil, @Auth)
  else result:=-1
  else result:=-2;
end;


все рабочие примеры утилизируют текст чека сразу после вызова, а мне он нужен позже, после вызова этой обертки.
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39901962
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Седоченко
все рабочие примеры утилизируют текст чека сразу после вызова, а мне он нужен позже, после вызова этой обертки.

Копируй после вызова во внутренние дельфийские типы и утилизируй исходное значение
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39902133
Всем огромное спасибо за помощь.
Предположение о мусоре было самым верным!!
Я бы еще дольше про...мучился если бы не понял что структуры должны быть packed.
Сколько не сравнивал код из разных источников просто не видел этого очевидного факта.
А все остальное ерунда. Можно хоть откуда вызывать, передавать и освобождать когда угодно.
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39924511
ehl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ehl
Гость
DmSer,
Подскажите пожалуйста есть рабочий пример получения хэш карты клиента и айди терминала?
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39924515
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде нет.
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39924522
ehl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ehl
Гость
DmSer,
Напишите в личку или на почту ehl98@mail.ru. Есть предложение для Вас.
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39924650
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Вроде нет.


Таки есть:

Хэш возвращается при обычном списании после вызова функции CardAuthorizeХХХ
Код: pascal
1.
2.
3.
4.
      if Assigned(SberCardAuthorize14) then
        Result.Hash := Copy(Auth14.Hash, 0, 40)
      else
        Result.Hash := Copy(Auth9.Hash, 0, 40);


Если нужно избежать оплаты, то в настройках TLV нужно задать параметр "Возвращать промежуточный код ответа", далее нужно ловить код 4353, в этом случае оплаты ещё нет, но информация по карте (включая хэш) уже есть.

Также при вызове функции '_ReadCardSB' (может не работать для NFC-оплаты)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
TSberReadCardSB = function(Last4Digits: PAnsiChar; Hash: PAnsiChar): Integer; cdecl;
SberReadCardSB: TSberReadCardSB;
@SberReadCardSB      := GetProcAddress(SberLib, '_ReadCardSB');

  Last4Digits: array[0..4] of Char;
  Hash: array[0..41] of Char;
Res := SberReadCardSB(@Last4Digits, @Hash)
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39924652
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ehl
DmSer,
Напишите в личку или на почту ehl98@mail.ru. Есть предложение для Вас.


Моя почта есть внизу на сайте из моего профиля.
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39925481
ehl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ehl
Гость
DmSer, спасибо большое работает!!!
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39926080
ehl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ehl
Гость
DmSer,
А как узнать принадлежит ли карта сбербанка?
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39926178
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ehl
DmSer,
А как узнать принадлежит ли карта сбербанка?

Исходя из этого:
https://www.banki.ru/wikibank/bankovskiy_identifikatsionnyiy_nomer/ Bank Identification Number (BIN), банковский идентификационный номер (БИН) - часть номера, расположенного на пластиковой карте. Используется для идентификации банка в рамках карточной платежной системы при авторизации, процессинге и клиринге.

БИН определяет платежную систему и тип карты в рамках этой платежной системе.

Например, карты VISA всегда начинаются с цифры 4. Формат номера регулируется ИСО/МЭК 7812-1 (выдает SWIFT). Но внутреннее деление внутри БИН является закрытой информацией платежной системы и доступно только ее участникам.
ответ: никак.

Но вот тут пишут что есть онлайн-сервисы, которые могут это делать, насколько им можно доверять - вопрос открытый.
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39926208
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ehl
DmSer,
А как узнать принадлежит ли карта сбербанка?


Код: pascal
1.
Auth9.SberOwnCard
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39927373
ehl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ehl
Гость
DmSer, спасибо то что нужно!

id терминала можно получить без оплаты? как Вы показали пример с получением хэш так же id можно получить?
...
Рейтинг: 0 / 0
Access Violation при получении строки из pilot_nt.dll
    #39927681
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ehl
DmSer, спасибо то что нужно!

id терминала можно получить без оплаты? как Вы показали пример с получением хэш так же id можно получить?

у владельца магазина надо спросить
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Access Violation при получении строки из pilot_nt.dll
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]