Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года

Проблемы с примером для LTR212

Вы не вошли.

 Поиск | Регистрация | Вход 

24.06.2023 14:25:40
#1

Участник
Здесь с 22.06.2023
Сообщений: 37

Проблемы с примером для LTR212

Ссылки на архивы ex114.7z и ex212.7z:

http://krym52.ru/k-forumu-lcard/

Крейт LTR-EU-8-1 содержит 3 модуля LTR114 в первых трех слотах и два модуля LTR212M-2 в слотах 4 и 5.
Разбирался с примерами программ, предлагаемыми LCard, для модулей LTR114 и LTR212.
Запустить программы с использованием LIB и DEF для подключения DLL поддержки работы модулей сходу не получилось, поэтому сделал вставки в файлы main.CPP (заменил C на C++), для динамического подключения этих DLL.
Фрагменты вставок с typedef, заданием переменных-ссылок на функции DLL и получением адресов функций приведены дополнительно в файлах
LTR114.TXT и LTR212.TXT.
В случае LTR114 удалось запустить пример и получить выдачу результатов, а в случае LTR212 происходит подключение модуля, выдает информацю о модуле, стартует измерение, но при первом обращении к функции LTR212_Recv бибиотеки ltr212api.DLL работа программы завершается без выдачи кода ошибки при завершении работы функции.
Хотелось бы получить комментарий по возникшей проблеме.
#
Файлы main.CPP содержат в основном тексты соответствующих файлов main.C из примеров LCard, плюс вставки для подключения DLL.
В файле для LTR212 были добавлены вставки выдач для трассировки выполнения (отладчик использовать не удалось, так как запуск  программ с подключением к крейту приходилось производить на удаленной машине).
Требуемые файлы *.h добавлены в папку проекта.
#
Используется Qt 5.9.0 и компилятор mingw53-32, установленный вместе с Qt.
Информация о системе (из справки Qt):
Qt 5.9.0 (i386-little_endian-ilp32 shared (dynamic) release build;
by MSVC 2015) on "windows"
OS: Windows 10 (10.0) [winnt version 10.0.14393]
Architecture: x86_64; features: SSE2 SSE3 SSSE3 SSE4.1
#
Состав файлов в папке на удаленном компьютере:
21.06.2023  23:09            63 686 ex114.exe
24.06.2023  13:42           153 029 ex212.exe
29.12.2015  01:25           120 334 libgcc_s_dw2-1.dll
29.12.2015  01:25         1 540 622 libstdc++-6.dll
29.12.2015  01:25            79 360 libwinpthread-1.dll
29.07.2010  16:11            86 016 ltr114api.dll
21.09.2020  15:23            98 700 ltr212.bio
19.04.2023  20:24           248 832 ltr212api.dll
04.05.2023  13:51            94 720 ltrapi.dll
Оба EXE файла скомпилированы как 32-битные, соответственно DLL также 32-битные. Файл ltr212.bio скопирован из примера от LCard.
Результаты работы EXE файлов содержатся в файлах res114.TXT и res212.TXT.

28.06.2023 21:02:16
#2

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,288

Re: Проблемы с примером для LTR212

Запустить программы с использованием LIB и DEF для подключения DLL поддержки работы модулей сходу не получилось

Не совсем понятно, что именно не получилось. Если Вы используете компилятор mingw 32-бит, то нужно использовать файлы из директории <путь установки ltrdll>/lib/mingw и прописать ключи -L<путь к файлам библиотек> и -lltr212api (-l<имя библиотеки без lib и .a>). Для проекта на qmake (как у Вас в примере) это нужно присвоить переменной LIBS в .pro файле (LIBS += -Lпуть -lltr212api). Если не получится, то напишите точно как подключаете и какие сообщения выдаются при компиляции проекта.

По поводу же Вашего способа динамической загрузки библиотеки и ее функций, то так можно делать, но в Ваших примерах есть проблема, что в объявлении не указаны соглашения вызова. Объявления в ltrapi используют макрос APIENTRY, который соответствует соглашению вызова stdcall, а соглашение вызова по умолчанию в C - cdecl. Из-за несоответствия соглашений в программе и библиотеке портится память, что и приводит к падению (для ltr114 это тоже справедливо, то, что в его примере не падет, это можно сказать повезло).

Соответственно во все typedef для функций ltrapi нужно добавить APIENTRY, например:

 typedef INT (* APIENTRY p_LTR212_Init)(PTLTR212 hnd); 

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск