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

Clarion, Clarion 7

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

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

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

Сообщение finsoftrz »

Линковка динамическая, как в библиотеке для атола.

У меня вроде получилось. Надо передавать первым параметром long.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Вот на примере функции чтения даты и времени, которая тоже возвращает mdata. Прототип такой задаем.

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

pirit_libGetPiritDateTime(LONG),RAW,PASCAL,PROC,DLL(_libGetPiritDateTime_),name('libGetPiritDateTime')
Проверочный код.

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

FsKKMPiritL.Test PROCEDURE 
MData group
errCode    LONG                      !код ошибки
dataStr    STRING(256)               !возвращаемая строка
dataLength LONG                      !длина возвращаемой строки
 end
loc:a1   long
   CODE

      loc:a1 = address(MData)
      pirit_libGetPiritDateTime(loc:a1)
      stop(clip(MData.dataStr))  
Выдает такое сообщение.
pirit.jpg
pirit.jpg (11.25 КБ) 2068 просмотров
Видно, что это вся строка, которая пришла с ккм, включая управляющие символы. Подчеркнул сегодняшнюю дату и время.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

Это значит, что вот это из совсем другой песни:

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

IMPORTDLL MData PIRITLIB_CALL libGetStatusFlags();
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Из той же, как ни странно. Это из. h файла, прилагаемого к библиотеке.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

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

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

Сообщение finsoftrz »

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

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

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

finsoftrz писал(а): 02 Декабрь 2021, 14:00 Я так думаю, от компилятора зависит.
Вполне может быть и такое. Например, какой-нибудь нетрадиционный форк C++.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

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

Сообщение Admin »

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

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

Сообщение finsoftrz »

Такой вопрос возник. Что в кларионе соответствует типу данных в с++ long long? Как я понял, это должно занимать 64 бит в памяти.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

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

1.jpg
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Вам бы только приколоться.

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

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

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

finsoftrz писал(а): 18 Декабрь 2021, 15:09 но работать с ним надо через push функции
Ну не знаю сколько лет этой информации ... :(
Посмотрите в папке LibSrc файл i64.inc. Там есть определение Int64 и и т.д.

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

! Declarations of INT64 and UINT64 types used in prototypes
!
! INT64    GROUP,TYPE
! lo         ULONG
! hi         LONG
!          END
!
! UINT64   GROUP,TYPE
! lo         ULONG
! hi         ULONG
!          END
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

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

Сообщение finsoftrz »

Такое я видел. Вопрос, как с этим работать.

Вообще, piritLib довольно непонятная библиотека с точки зрения прототипов. Хорошо, что есть обходной путь, можно напрямую передавать инструкции в виде, соответствующем протоколу обмена. Я через этот механизм и обхожу места, где вызовы штатных функций возвращают, что не так переданы параметры, и приложение вылетает.
Оставлю, как передать инструкцию напрямую. Там тоже интересный синтаксис.
Определение на С.

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

IMPORTDLL MData PIRITLIB_CALL libSendCommand(piritCommand_t cmd, int num, ...);
IMPORTDLL int PIRITLIB_CALL libSendCommandAsync(piritCommand_t cmd, int num, ...);
В кларионе этому соответствует.

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

pirit_libSendCommand(LONG, BYTE, LONG, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>),RAW,C,DLL(_libSendCommand_),name('libSendCommand')
pirit_libSendCommandAsync(BYTE, LONG, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>, <*CSTRING>),LONG,RAW,C,PROC,DLL(_libSendCommandAsync_),name('libSendCommandAsync')
То есть тут передается переменное число параметров в виде строк. В num указывается их количество, в cmd код команды. У себя в прототипе закладываем столько *cstring, сколько практически может потребоваться. Делаем переменные cstring, присваиваем им нужные значения как строки, передаем в вызове. Первая функция возвращает структуру mdata по адресу, в переданном первом параметре, как уже обсуждалось в этой теме. Оттуда забираем нужные значения ответа как подстроки.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
atashe3
Новичок
Сообщения: 21
Зарегистрирован: 26 Декабрь 2021, 13:32

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

Сообщение atashe3 »

Игорь Столяров писал(а): 02 Декабрь 2021, 12:38 что при mdata надо что-то в параметрах передавать
Решал задачу передачи структуры IMPORTDLL MData PIRITLIB_CALL
через переходник СИ, для всех подобных функций, все успешно

Т.к. Сларион не совместим с Сишным Return структуры, т.к. библиотека Piritlib написана на VC

Примерно так, Piritlib загружается димамически

adapter_libGetPrinterStatus_pirit(long _procAddress,long _pMD),name('_adapter_libGetPrinterStatus_pirit')


#include <STRING.H>
#define __stdcall cdecl

typedef struct tagMData {
int errCode;
char data[256];
int dataLength;
}MData;
/* ************************************************************************* */
//IMPORTDLL MData PIRITLIB_CALL libGetPrinterStatus();

typedef MData (__stdcall* LPFNDLLfGetPrinterStatus)( );


extern "C" void adapter_libGetPrinterStatus_pirit(void* procAddress,void *pMD)
{
LPFNDLLfGetPrinterStatus fGetPrinterStatus;
fGetPrinterStatus = (LPFNDLLfGetPrinterStatus)procAddress;
MData MD;
MD = fGetPrinterStatus();
memcpy(pMD,&MD,sizeof(MD));
}
/* ************************************************************************* */
Ответить