Страница 2 из 2
Вернуть структуру из сишной dll
Добавлено: 02 Декабрь 2021, 12:51
finsoftrz
Линковка динамическая, как в библиотеке для атола.
У меня вроде получилось. Надо передавать первым параметром long.
Вернуть структуру из сишной dll
Добавлено: 02 Декабрь 2021, 12:58
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 (11.25 КБ) 2150 просмотров
Видно, что это вся строка, которая пришла с ккм, включая управляющие символы. Подчеркнул сегодняшнюю дату и время.
Вернуть структуру из сишной dll
Добавлено: 02 Декабрь 2021, 13:53
Игорь Столяров
Это значит, что вот это из совсем другой песни:
Код: Выделить всё
IMPORTDLL MData PIRITLIB_CALL libGetStatusFlags();
Вернуть структуру из сишной dll
Добавлено: 02 Декабрь 2021, 13:59
finsoftrz
Из той же, как ни странно. Это из. h файла, прилагаемого к библиотеке.
Вернуть структуру из сишной dll
Добавлено: 02 Декабрь 2021, 14:00
finsoftrz
Я так думаю, от компилятора зависит.
Вернуть структуру из сишной dll
Добавлено: 02 Декабрь 2021, 14:03
finsoftrz
Для libGetPiritDateTime декларация в h файле идентичная, отличается только название функции.
Вернуть структуру из сишной dll
Добавлено: 02 Декабрь 2021, 14:12
Игорь Столяров
finsoftrz писал(а): ↑02 Декабрь 2021, 14:00
Я так думаю, от компилятора зависит.
Вполне может быть и такое. Например, какой-нибудь нетрадиционный форк C++.
Вернуть структуру из сишной dll
Добавлено: 03 Декабрь 2021, 2:26
Admin
Вернуть структуру из сишной dll
Добавлено: 18 Декабрь 2021, 13:31
finsoftrz
Такой вопрос возник. Что в кларионе соответствует типу данных в с++ long long? Как я понял, это должно занимать 64 бит в памяти.
Вернуть структуру из сишной dll
Добавлено: 18 Декабрь 2021, 14:11
Игорь Столяров
Вернуть структуру из сишной dll
Добавлено: 18 Декабрь 2021, 15:09
finsoftrz
Вам бы только приколоться.
В файле с декларациями для вин апи есть фраза, что со стороны клариона long long это long, но работать с ним надо через push функции.
Вернуть структуру из сишной dll
Добавлено: 18 Декабрь 2021, 15:28
Игорь Столяров
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
Вернуть структуру из сишной dll
Добавлено: 18 Декабрь 2021, 16:12
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 по адресу, в переданном первом параметре, как уже обсуждалось в этой теме. Оттуда забираем нужные значения ответа как подстроки.
Вернуть структуру из сишной dll
Добавлено: 26 Декабрь 2021, 15:16
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));
}
/* ************************************************************************* */