ATOL драйвер 10.x

Сканеры, кассы, ККТ и т.д.
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2941
Зарегистрирован: 06 Ноябрь 2014, 12:48

ATOL драйвер 10.x

Сообщение finsoftrz »

Многие библиотеки на си или делфи однопоточные. При использовании их в mdi окнах вылезают разные сюрпризы. Скорее всего, это тот случай.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

ATOL драйвер 10.x

Сообщение Игорь Столяров »

Мрак ! :( Ну хорошо, что хоть сюрпризы относятся к работе функции с открытием окна, а не всех.
«V» значит Вендетта !
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2941
Зарегистрирован: 06 Ноябрь 2014, 12:48

ATOL драйвер 10.x

Сообщение finsoftrz »

Да, речь про открытие их окон. Был случай с библиотекой, которая выгружает данные в тсд, если правильно помню. Она открывала свое окно с прогрессором. Отрабатывала, но затем при выходе из приложения вываливалось окно о попытке обращения в недоступную область памяти. Пришлось сделать окно, из которого был вызов, модальным, тогда все нормализовалось. Это не очень удобно, но, в целом, устроило.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

ATOL драйвер 10.x

Сообщение Игорь Столяров »

finsoftrz писал(а): 11 Июль 2020, 7:04 Пришлось сделать окно, из которого был вызов, модальным, тогда все нормализовалось.
Жуть ! Я это пробовал: открывал NotMDI модальное окно и даже передавал при вызове его {Prop:Handle} - не помогает.
Вообще - проблема достаточно скользкая, т.к. проявляется при первом вызове окна и потом надо перезагружать комп. :(
«V» значит Вендетта !
Аватара пользователя
SergioRaguzini
Активист
Сообщения: 139
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край

ATOL драйвер 10.x

Сообщение SergioRaguzini »

Привет Всем!
Потребовалось считать информацию о ФН (в частности, серийный номер ФН), посмотрел документацию, обратил внимание что вызов метода fnQueryData() похож на QueryData()

в load_procedures.clw добавил:

Код: Выделить всё

cstr_libfptr_fn_query_data CSTRING('libfptr_fn_query_data')
в procedure_eq.clw

Код: Выделить всё

_libfptr_fn_query_data_ LONG,STATIC,NAME('libfptr_fn_query_data')
...
cstr_libfptr_fn_query_data CSTRING('libfptr_fn_query_data')
в Global Map:

Код: Выделить всё

      libfptr_fn_query_data(LONG fptr),LONG,RAW,C,PROC,DLL(_libfptr_fn_query_data_)
Создал локальную процедуру по аналогии с QueryData() :

Код: Выделить всё

!- -  = * = - -  = * = - -  = * = - -  = * = - -  = * = - -  = * = - -  = * = - -!
Atol10.fnQueryData           PROCEDURE()!,LONG,PROC         
!- -  = * = - -  = * = - -  = * = - -  = * = - -  = * = - -  = * = - -  = * = - -!
  CODE

  IF ~ SELF.FlagLoaded THEN RETURN LIBFPTR_ERROR END
  RETURN libfptr_fn_query_data(SELF.fptr)

!.  .  .  .  .  к о н е ц   п р о ц е д у р ы  .  .  .  .  .  .!
хочу получить серийный номер, вызываю:

Код: Выделить всё

    
LOC:fn_Serial        STRING(25)
...
fnQueryData                 PROCEDURE(),LONG,PROC

 CODE   
    ATOL.SetParamInt(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO)
     ATOL.fnQueryData()
     LOC:fn_Serial = ATOL.GetParamStr(LIBFPTR_PARAM_SERIAL_NUMBER)
     MESSAGE('LOC:fn_Serial = ' & LOC:fn_Serial)
ошибок исполнения нет, но, к сожалению, серийный номер тоже не отображается (пусто)
При аналогичной операции с QueryData заводской номер отображается корректно, а вот при информации по ФН нет....
Пытаюсь который день, но никак не пойму в чем проблема?

Караул, Help!
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

ATOL драйвер 10.x

Сообщение Yufil »

Иногда помогает парочка UnlockThread() - LockThread()
UnlockThread вызывается перед обращением к OLE-объекту, а LockThread - после обращения.
Если у объекта есть GUI - строго обязательно.

Да, внутри cкобок UnlockThread - LockThread многие кларионовские вычисления недопустимы, передал-получил значения - закрывайся!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

ATOL драйвер 10.x

Сообщение Игорь Столяров »

Yufil писал(а): 30 Сентябрь 2020, 15:43 Если у объекта есть GUI - строго обязательно.
О, точно ! Спасибо ! Вот это ещё забыл попробовать с вызовом метода окна настройки
драйвера АТОЛ ДКК10 libfptr_show_properties(). Сейчас сделаем и проверим. :)
«V» значит Вендетта !
Аватара пользователя
SergioRaguzini
Активист
Сообщения: 139
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край

ATOL драйвер 10.x

Сообщение SergioRaguzini »

Yufil писал(а): 30 Сентябрь 2020, 15:43 Иногда помогает парочка UnlockThread() - LockThread()
UnlockThread вызывается перед обращением к OLE-объекту, а LockThread - после обращения.
Если у объекта есть GUI - строго обязательно.
Да, внутри cкобок UnlockThread - LockThread многие кларионовские вычисления недопустимы, передал-получил значения - закрывайся!
Да, но применительно к данной теме, обращение к методам и свойствам драйвера идет не через OLE...

Игорь Столяров писал(а): 30 Сентябрь 2020, 18:09 О, точно ! Спасибо ! Вот это ещё забыл попробовать с вызовом метода окна настройки
драйвера АТОЛ ДКК10 libfptr_show_properties(). Сейчас сделаем и проверим. :)

Код: Выделить всё

  IF ~ SELF.FlagLoaded THEN RETURN LIBFPTR_ERROR END
  RETURN libfptr_show_properties(SELF.fptr, LIBFPTR_GUI_PARENT_NATIVE, WindowHandle)
Проверил, вроде работает - окно "свойств" открывается, "Проверка связи" действует корректно...
А вот информацию о ФН получить пока не могу
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

ATOL драйвер 10.x

Сообщение Игорь Столяров »

SergioRaguzini писал(а): 30 Сентябрь 2020, 18:37 применительно к данной теме, обращение к методам и свойствам драйвера идет не через OLE
Ну про OLE написал Юрий, в справке этого нет. Блокировка применяется к внешним вызовам с интерфейсом.
SergioRaguzini писал(а): 30 Сентябрь 2020, 18:37 окно "свойств" открывается
Да оно всегда открывается. Но при первом вызове из MDI окна как "с того света" (секунд 30), а если
повторно открыть MDI окно и повторить вызов - всё становится колом, я уже рассказывал об этом.
Проблема-то решена костылём, но хотелось бы понять происходящее ...
SergioRaguzini писал(а): 30 Сентябрь 2020, 18:37 А вот информацию о ФН получить пока не могу
Вы прикрутили некий метод по принципу похожести. Смысл действия ?
В справке АТОЛ ДККТ10 есть огромный раздел "Запрос информации из ФН" на человеческом языке.
В нём, в т.ч., подробно описано получение серийного номера ФН. Какие проблемы ? ;)
«V» значит Вендетта !
Аватара пользователя
SergioRaguzini
Активист
Сообщения: 139
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край

ATOL драйвер 10.x

Сообщение SergioRaguzini »

Игорь Столяров писал(а): 30 Сентябрь 2020, 19:40 ...В справке АТОЛ ДККТ10 есть огромный раздел "Запрос информации из ФН" на человеческом языке.
В нём, в т.ч., подробно описано получение серийного номера ФН...
Игорь, извиняюсь за тугодумие, описание fnQueryData() я сделал интуитивно по аналогии с нормально работающей QueryData()
Конечно, я читал упомянутый вами раздел справки, но в ней:
libfptr_set_param_int(fptr, LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO);
libfptr_fn_query_data(fptr);

std::vector<wchar_t> str(1024);
int size = libfptr_get_param_str(fptr, LIBFPTR_PARAM_SERIAL_NUMBER, &str[0], str.size());
if (size > str.size())
{
str.resize(size);
libfptr_get_param_str(fptr, LIBFPTR_PARAM_SERIAL_NUMBER, &str[0], str.size());
}
std::wstring fnSerial = std::wstring(&str[0]);
для получения серийного номера используются дополнительные size, а что будет эквивалентом в Clarion-программе и как правильно сделать аналогичный вызов для Clarion, я, к сожалению не пойму (+ м.б. мое описание fnQueryData() неверно?) :? потому и прошу помощи на примере куска кода

Спасибо
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

ATOL драйвер 10.x

Сообщение Игорь Столяров »

SergioRaguzini писал(а): 30 Сентябрь 2020, 20:46 прошу помощи на примере куска кода
Куска когда нет, как и фискализированного накопителя.
Но есть немного сочувствия. ;) Зачем Вы так глубоко роете ?
По моему Админ для нас уже всё сделал. На вскидку:

Код: Выделить всё

  Atol10.SetParamInt(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO)
  Atol10.FNQueryData()
  Message(Atol10.GetParamStr(LIBFPTR_PARAM_SERIAL_NUMBER)) ! Отгружайте здесь Ваш серийник ФН ...
«V» значит Вендетта !
Аватара пользователя
SergioRaguzini
Активист
Сообщения: 139
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край

ATOL драйвер 10.x

Сообщение SergioRaguzini »

Игорь Столяров писал(а): 30 Сентябрь 2020, 21:55 ...На вскидку:

Код: Выделить всё

  Atol10.SetParamInt(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO)
  Atol10.FNQueryData()
  Message(Atol10.GetParamStr(LIBFPTR_PARAM_SERIAL_NUMBER)) ! Отгружайте здесь Ваш серийник ФН ...
Игорь, Спасибо! Но в том то и дело что это (у меня, к сожалению) не работает! Гляньте несколько сообщений вверх, вот мое с которого я начал сегодняшнее обсуждение:
хочу получить серийный номер, вызываю:

Код: Выделить всё

LOC:fn_Serial        STRING(25)
...
fnQueryData                 PROCEDURE(),LONG,PROC

 CODE   
    ATOL.SetParamInt(LIBFPTR_PARAM_FN_DATA_TYPE, LIBFPTR_FNDT_FN_INFO)
     ATOL.fnQueryData()
     LOC:fn_Serial = ATOL.GetParamStr(LIBFPTR_PARAM_SERIAL_NUMBER)
     MESSAGE('LOC:fn_Serial = ' & LOC:fn_Serial)
идентичны :D ! если бы заработало - было бы хорошо, но это не так. Будет минутка - попробуйте у себя
Аватара пользователя
SergioRaguzini
Активист
Сообщения: 139
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край

ATOL драйвер 10.x

Сообщение SergioRaguzini »

Игорь Столяров писал(а): 30 Сентябрь 2020, 21:55 ...нет, как и фискализированного накопителя...
Номер ФН отображается независимо от того фискализирован он или нет
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

ATOL драйвер 10.x

Сообщение Игорь Столяров »

SergioRaguzini писал(а): 30 Сентябрь 2020, 22:24 Будет минутка - попробуйте у себя
Я не вижу в этом коде проблем.
Но у меня не фискализирован ФН и как следствие не проходит запрос на параметры ФН:

1.jpg
1.jpg (25.84 КБ) 2490 просмотров
SergioRaguzini писал(а): 30 Сентябрь 2020, 22:38 Номер ФН отображается независимо от того фискализирован он или нет
Не согласен - ошибка явно указывает на некорректное состояние ФН.
«V» значит Вендетта !
Аватара пользователя
SergioRaguzini
Активист
Сообщения: 139
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край

ATOL драйвер 10.x

Сообщение SergioRaguzini »

Привет Всем!
Игорь Столяров писал(а): 30 Сентябрь 2020, 22:41 ...не фискализирован ФН и как следствие не проходит запрос на параметры ФН...
Дело не в том - фискализирован ли ФН или нет - информация о нем (номер ФН и т.д.) должна отображаться. Я, конечно, больше работал с "ШТРИХ"-ами, но, наверняка АТОЛ работает по такому же принципу.
У меня в АТОЛ-11Ф стоит МГМ-ФН и чтобы отбросить сомнения, если хотите, могу свой АТОЛ сбросить (расфискализировать) и взять вашу тестовую программку посмотреть - получим ли упомянутую выше ошибку.
Я, только что, у себя собрал тестовую программку для ДТО-8 и попробовал считать номер ФН и информация о нем считывается корректно, в ДТО-10 тоже, но только через "Тест драйвера", а прикладной из Clarion пока нет - пустота...
Вложения
для ДТО-8
для ДТО-8
fn_8.jpg (9.78 КБ) 2439 просмотров
fn_10.jpg
fn_10.jpg (69.46 КБ) 2439 просмотров
Последний раз редактировалось SergioRaguzini 01 Октябрь 2020, 14:40, всего редактировалось 1 раз.
Ответить