Страница 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
pirit.jpg (11.25 КБ) 2154 просмотра
Видно, что это вся строка, которая пришла с ккм, включая управляющие символы. Подчеркнул сегодняшнюю дату и время.

Вернуть структуру из сишной 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
Просто пусть тут полежит PiritLib 2.0.1.4 с документацией.zip

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

Добавлено: 18 Декабрь 2021, 13:31
finsoftrz
Такой вопрос возник. Что в кларионе соответствует типу данных в с++ long long? Как я понял, это должно занимать 64 бит в памяти.

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

Добавлено: 18 Декабрь 2021, 14:11
Игорь Столяров
1.jpg

Вернуть структуру из сишной 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));
}
/* ************************************************************************* */