Вернуть структуру из сишной dll
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4629
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 7 раз
- Поблагодарили: 37 раз
Вернуть структуру из сишной dll
Линковка динамическая, как в библиотеке для атола.
У меня вроде получилось. Надо передавать первым параметром long.
У меня вроде получилось. Надо передавать первым параметром long.
C6/C11, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4629
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 7 раз
- Поблагодарили: 37 раз
Вернуть структуру из сишной dll
Вот на примере функции чтения даты и времени, которая тоже возвращает 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))
Видно, что это вся строка, которая пришла с ккм, включая управляющие символы. Подчеркнул сегодняшнюю дату и время.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7385
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 14 раз
- Поблагодарили: 49 раз
Вернуть структуру из сишной dll
Это значит, что вот это из совсем другой песни:
Код: Выделить всё
IMPORTDLL MData PIRITLIB_CALL libGetStatusFlags();
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4629
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 7 раз
- Поблагодарили: 37 раз
Вернуть структуру из сишной dll
Из той же, как ни странно. Это из. h файла, прилагаемого к библиотеке.
C6/C11, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4629
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 7 раз
- Поблагодарили: 37 раз
Вернуть структуру из сишной dll
Для libGetPiritDateTime декларация в h файле идентичная, отличается только название функции.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7385
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 14 раз
- Поблагодарили: 49 раз
Вернуть структуру из сишной dll
Вполне может быть и такое. Например, какой-нибудь нетрадиционный форк C++.
За теми кто отстал - не возвращаться. (С) Кодекс
- Admin
- Администратор
- Сообщения: 3961
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 25 раз
- Поблагодарили: 22 раза
- Контактная информация:
Вернуть структуру из сишной dll
Просто пусть тут полежит PiritLib 2.0.1.4 с документацией.zip
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4629
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 7 раз
- Поблагодарили: 37 раз
Вернуть структуру из сишной dll
Такой вопрос возник. Что в кларионе соответствует типу данных в с++ long long? Как я понял, это должно занимать 64 бит в памяти.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7385
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 14 раз
- Поблагодарили: 49 раз
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4629
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 7 раз
- Поблагодарили: 37 раз
Вернуть структуру из сишной dll
Вам бы только приколоться.
В файле с декларациями для вин апи есть фраза, что со стороны клариона long long это long, но работать с ним надо через push функции.
В файле с декларациями для вин апи есть фраза, что со стороны клариона long long это long, но работать с ним надо через push функции.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7385
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 14 раз
- Поблагодарили: 49 раз
Вернуть структуру из сишной dll
Ну не знаю сколько лет этой информации ...
Посмотрите в папке 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
- ✯ Ветеран ✯
- Сообщения: 4629
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 7 раз
- Поблагодарили: 37 раз
Вернуть структуру из сишной dll
Такое я видел. Вопрос, как с этим работать.
Вообще, piritLib довольно непонятная библиотека с точки зрения прототипов. Хорошо, что есть обходной путь, можно напрямую передавать инструкции в виде, соответствующем протоколу обмена. Я через этот механизм и обхожу места, где вызовы штатных функций возвращают, что не так переданы параметры, и приложение вылетает.
Оставлю, как передать инструкцию напрямую. Там тоже интересный синтаксис.
Определение на С.
В кларионе этому соответствует.
То есть тут передается переменное число параметров в виде строк. В num указывается их количество, в cmd код команды. У себя в прототипе закладываем столько *cstring, сколько практически может потребоваться. Делаем переменные cstring, присваиваем им нужные значения как строки, передаем в вызове. Первая функция возвращает структуру mdata по адресу, в переданном первом параметре, как уже обсуждалось в этой теме. Оттуда забираем нужные значения ответа как подстроки.
Вообще, 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')
C6/C11, ШВС, tps/btrieve.
Вернуть структуру из сишной dll
Решал задачу передачи структуры 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));
}
/* ************************************************************************* */