Вернуть структуру из сишной dll

Clarion, Clarion 7

Модератор: Дед Пахом

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

Вернуть структуру из сишной dll

Сообщение finsoftrz »

Добрый день. Смотрю одну библиотеку на си. У нее некоторые функции возвращают структуру данных. Может, кто сталкивался, как описать прототип на кларионе?
Более конкретно.
Структура определена так.

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

typedef struct tagMData {
	int errCode;
	char data[256];
	int dataLength;
}MData;
Прототип вызова функции.

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

IMPORTDLL MData PIRITLIB_CALL libGetCountersAndRegisters(unsigned char numRequest);
В кларионе пробовал по разному, падает при вызове.

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

pirit_libGetCountersAndRegisters(BYTE),????,RAW,PASCAL,PROC,DLL(_libGetCountersAndRegisters_),name('libGetCountersAndRegisters')
Передача параметров PASCAL, с вызовами других функций проблем нет.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Вернуть структуру из сишной dll

Сообщение Admin »

Типа так но про STRING не уверен... может CSTRING

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

MData       GROUP
errCode       LONG
data          STRING(256)
dataLength    LONG
            END

get_group   &MData

  CODE
  get_group &= pirit_libGetCountersAndRegisters(???)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Вернуть структуру из сишной dll

Сообщение Admin »

pirit_libGetCountersAndRegisters должна возвращать LONG. Адрес структуры
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Вернуть структуру из сишной dll

Сообщение Admin »

СИ вроде как то так описываются

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

   MODULE('pilot_nt.dll')
     TSB_TestPinpad(),LONG,RAW,C,DLL(_TSB_TestPinpad_)
     TSB_card_authorize7(LONG track2, LONG auth_answer7_addr),LONG,RAW,C,DLL(_TSB_card_authorize7_)
     TSB_close_day(LONG auth_answer_addr),LONG,RAW,C,DLL(_TSB_close_day_)
   END
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4615
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Вернуть структуру из сишной dll

Сообщение finsoftrz »

В том то и дело, что не возвращает, падает при вызове. В том числе и при такой декларации.

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

pirit_libGetCountersAndRegisters(BYTE),LONG,RAW,PASCAL,PROC,DLL(_libGetCountersAndRegisters_),name('libGetCountersAndRegisters')
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Вернуть структуру из сишной dll

Сообщение Admin »

Я как то на такое попадал. Как то хитро решалось типа выключить (или включить) режим отладки Clarion DLL :)
Но по итогу потом переписал на динамическую загрузку и все решилось.
Вот ниже динамическая загрузка сберовской pilot_nt.dll для проверки подключения и вызова диалога оплаты
Вложения
cfc.zip
(93.55 КБ) 90 скачиваний
sbrf.zip
(2.39 КБ) 98 скачиваний
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4615
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Вернуть структуру из сишной dll

Сообщение finsoftrz »

Вот так работают все функции, кроме pirit_libGetStatusFlags и pirit_libGetCountersAndRegisters, которые должны возвращать структуру mdata. При их вызове приложение падает.

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

     MODULE('piritlib.dll')
       pirit_openPort(*cstring port, LONG speed),LONG,RAW,PASCAL,PROC,DLL(_openPort_),name('openPort')
       pirit_closePort(),LONG,RAW,PASCAL,PROC,DLL(_closePort_),name('closePort')
       pirit_checkPortAsync(*cstring port, LONG speed),LONG,RAW,PASCAL,PROC,DLL(_checkPortAsync_),name('checkPortAsync')
       pirit_commandStart(),LONG,RAW,PASCAL,PROC,DLL(_commandStart_),name('commandStart')
       pirit_libGetStatusFlags(),LONG,RAW,PASCAL,PROC,DLL(_libGetStatusFlags_),name('libGetStatusFlags')
       pirit_getStatusFlags(*LONG, *LONG, *LONG),LONG,RAW,PASCAL,PROC,DLL(_getStatusFlags_),name('getStatusFlags')
       pirit_getKKTInfo(BYTE, *CSTRING),LONG,RAW,PASCAL,PROC,DLL(_getKKTInfo_),name('getKKTInfo')
       pirit_libGetCountersAndRegisters(BYTE),LONG,RAW,PASCAL,PROC,DLL(_libGetCountersAndRegisters_),name('libGetCountersAndRegisters')
       pirit_scrollPaper(),LONG,RAW,PASCAL,PROC,DLL(_scrollPaper_),name('scrollPaper')
       pirit_libCutDocument(),LONG,RAW,PASCAL,PROC,DLL(_libCutDocument_),name('libCutDocument')
       pirit_libOpenDocument(BYTE, BYTE, *CSTRING, LONG ),LONG,RAW,PASCAL,PROC,DLL(_libOpenDocument_),name('libOpenDocument')
       pirit_libCancelDocument(),LONG,RAW,PASCAL,PROC,DLL(_libCancelDocument_),name('libCancelDocument')
       pirit_libPrintString(*CSTRING str, BYTE attr),LONG,RAW,PASCAL,PROC,DLL(_libPrintString_),name('libPrintString')
     END
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Вернуть структуру из сишной dll

Сообщение Admin »

Т.е. дело вообще не в возвращаемых параметрах если падает с ,PROC
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4615
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Вернуть структуру из сишной dll

Сообщение finsoftrz »

Я тоже через динамическую загрузку делаю, как в классе для atol, по аналогии.
Падает и с proc, и без...
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4615
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Вернуть структуру из сишной dll

Сообщение finsoftrz »

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

Вернуть структуру из сишной dll

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

finsoftrz писал(а): 02 Декабрь 2021, 10:29 pirit_libGetStatusFlags() падает
Покажите пожалуйста сишный прототип функции.
Вы начали с одной функции, перескочили на другую ... :(

Вообще возвращаемое значение никак не влияет на успешность вызова в Clarion.
Можете вообще ничего не получать (с "PROC").
Если вызов метода падает - проблема в описании входных параметров и самого метода.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4615
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Вернуть структуру из сишной dll

Сообщение finsoftrz »

Да тоже самое все.

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

IMPORTDLL MData PIRITLIB_CALL libGetStatusFlags();
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4615
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Вернуть структуру из сишной dll

Сообщение finsoftrz »

Часть функций в библиотеки продублированы в более удобоваримый вид с передачей параметра с адресом для результата. Но не все из нужных...
Например, вышеприведенная.

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

IMPORTDLL int PIRITLIB_CALL getStatusFlags(int *fatalStatus, int *currentFlagsStatus, int *documentStatus);
Такая конструкция вызывается без проблем.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4615
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Вернуть структуру из сишной dll

Сообщение finsoftrz »

У меня пока подозрение, что при mdata надо что-то в параметрах передавать. Я погуглил еще, в интернете тоже есть обсуждения проблемы (не для клариона). Но решения пока не увидел.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7372
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Вернуть структуру из сишной dll

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

finsoftrz писал(а): 02 Декабрь 2021, 12:15 что при mdata надо что-то в параметрах передавать
Вряд ли. :( Вариант вызова без получения результата падает ?
Без динамической загрузки, с обычной линковкой DLL.

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

  pirit_libGetStatusFlags()
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить