Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Access Violation при получении строки из pilot_nt.dll  [new]
Андрей Седоченко
Member

Откуда:
Сообщений: 8
Добрый всем день!

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

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

Может быть кто-то решал похожую проблему? И доступ к этому участку памяти все же возможен...
12 дек 19, 11:14    [22038481]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
alekcvp
Member

Откуда:
Сообщений: 1861
Андрей Седоченко,

Если delphi 7, то библиотека явно 32-х битная, иначе бы вы её загрузить не смогли.
Я бы проверил описание импортируемых функций и соглашения о вызове, т.к. возможно что адрес за пределами 3Гб - это мусор, отсюда и AV.
12 дек 19, 11:30    [22038498]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
a4sdg
Member

Откуда:
Сообщений: 18
когда использовал эту либу pilot_nt.sberbank
не заметил проблем с получением текста чека
12 дек 19, 11:38    [22038507]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26396
Андрей Седоченко
который передается как lpChar

Юникодный наверное?
12 дек 19, 12:13    [22038558]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
Андрей Седоченко
Member

Откуда:
Сообщений: 8
Самое странное то. что у меня есть старая процедура, которая подгружает библиотеку, делает запрос и получает чек одним куском кода, и она работает. Но изменились требования к интерфейсу и теперь все разнесено по разным процедурам и по времени обращения. После этого стал получать AV.
12 дек 19, 12:18    [22038561]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
Андрей Седоченко
Member

Откуда:
Сообщений: 8
a4sdg
когда использовал эту либу pilot_nt.sberbank
не заметил проблем с получением текста чека

Я ее только вчера обнаружил, еще не пробовал. Все попытки были пока что, решить своими силами, но они безуспешны. Но подход из этой либы я еще попробую, т.е. на каждый вызов библиотечной функции делать новую загрузку библиотеки.
12 дек 19, 12:23    [22038565]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1052
С такой проблемой мы не сталкивались.
Вы поля структуры TAuthAnswerXXX обнуляете перед вызовом функции "_card_authorizeXXX", или у Вас там мусор? Версию "_card_authorize" какую используете? 14-ю?

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

Освободить память так:
GlobalFree(DWORD(AuthXXX.ans.Check))
12 дек 19, 13:02    [22038603]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
Андрей Седоченко
Member

Откуда:
Сообщений: 8
DmSer,

Все делаю именно так и в такой последовательности. версию _card_authorize использовал без номера и 9.
12 дек 19, 13:26    [22038616]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1052
Раз AV возникает, значит все-таки что-то Вы не так делаете.
Функцию "_SetGUIHandles" используете?

Насчёт того, чтобы библиотеку загружать каждый раз заново: мы так и сделали, поскольку в ней есть глюки, программисты Сбера исправить их не смогли (года два мы их просили об этом, то она у них иногда зависает, то СОМ-порты не закрывает), поэтому сделали отдельную программу "2", её запускает основная программа "1", программа "2" выполняет команду и закрывается. Если вдруг программа "2" зависает, то в программе "1" это детектируется и процесс программы "2" убивается.
12 дек 19, 14:15    [22038671]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1052
Попробуйте Это
пароль: 2017
12 дек 19, 14:37    [22038707]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
Андрей Седоченко
Member

Откуда:
Сообщений: 8
DmSer,

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

Может быть все дело в том что я добавил обертку к библиотечной функции примерно вот таким способом
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;

все рабочие примеры утилизируют текст чека сразу после вызова, а мне он нужен позже, после вызова этой обертки.

Сообщение было отредактировано: 12 дек 19, 15:15
12 дек 19, 15:13    [22038776]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
Василий 2
Member

Откуда:
Сообщений: 965
Андрей Седоченко
все рабочие примеры утилизируют текст чека сразу после вызова, а мне он нужен позже, после вызова этой обертки.

Копируй после вызова во внутренние дельфийские типы и утилизируй исходное значение
12 дек 19, 15:58    [22038843]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
Андрей Седоченко
Member

Откуда:
Сообщений: 8
Всем огромное спасибо за помощь.
Предположение о мусоре было самым верным!!
Я бы еще дольше про...мучился если бы не понял что структуры должны быть packed.
Сколько не сравнивал код из разных источников просто не видел этого очевидного факта.
А все остальное ерунда. Можно хоть откуда вызывать, передавать и освобождать когда угодно.
12 дек 19, 20:27    [22039129]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
ehl
Member

Откуда:
Сообщений: 5
DmSer,
Подскажите пожалуйста есть рабочий пример получения хэш карты клиента и айди терминала?
10 фев 20, 07:13    [22076495]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1052
Вроде нет.

Сообщение было отредактировано: 10 фев 20, 07:44
10 фев 20, 07:43    [22076499]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
ehl
Member

Откуда:
Сообщений: 5
DmSer,
Напишите в личку или на почту ehl98@mail.ru. Есть предложение для Вас.
10 фев 20, 08:29    [22076506]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1052
DmSer
Вроде нет.


Таки есть:

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

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

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

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)
10 фев 20, 13:05    [22076733]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1052
ehl
DmSer,
Напишите в личку или на почту ehl98@mail.ru. Есть предложение для Вас.


Моя почта есть внизу на сайте из моего профиля.
10 фев 20, 13:06    [22076736]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
ehl
Member

Откуда:
Сообщений: 5
DmSer, спасибо большое работает!!!
12 фев 20, 09:51    [22078008]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
ehl
Member

Откуда:
Сообщений: 5
DmSer,
А как узнать принадлежит ли карта сбербанка?
13 фев 20, 03:57    [22078934]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
alekcvp
Member

Откуда:
Сообщений: 1861
ehl
DmSer,
А как узнать принадлежит ли карта сбербанка?

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

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

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

ответ: никак.

Но вот тут пишут что есть онлайн-сервисы, которые могут это делать, насколько им можно доверять - вопрос открытый.
13 фев 20, 11:44    [22079108]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1052
ehl
DmSer,
А как узнать принадлежит ли карта сбербанка?


Auth9.SberOwnCard
13 фев 20, 12:49    [22079174]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
ehl
Member

Откуда:
Сообщений: 5
DmSer, спасибо то что нужно!

id терминала можно получить без оплаты? как Вы показали пример с получением хэш так же id можно получить?
17 фев 20, 12:07    [22081158]     Ответить | Цитировать Сообщить модератору
 Re: Access Violation при получении строки из pilot_nt.dll  [new]
Cobalt747
Member

Откуда:
Сообщений: 2137
ehl
DmSer, спасибо то что нужно!

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

у владельца магазина надо спросить
17 фев 20, 22:06    [22081722]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить