Получение класса из C++ dll

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Получение класса из C++ dll

Сообщение vitaliper54 » 30.05.2021 22:08:29

Версия Lazarus'a: lazarus-2.0.12-fpc-3.2.0
OS: Windows 10
Delphi: 10.4

Начало здесь: http://www.freepascal.ru/forum/viewtopic.php?f=5&t=5811
Данной ссылке уже 10 лет и описанная там проблема так и не была решена, поэтому я рискнул вернуться к этой теме повторно:

Конкретно, проблема возникает при попытке подключения внешнего модуля АЦП E14-140 с использованием фирменной (от L-Card) библиотеки dll lcomp (имеется также библиотека lusbapi, но и с ней возникают аналогичные проблемы).
В комплект программного обеспечения для Delphi от L-Card входит учебная программа 17xxdpr, которая прекрасно компилируется и RAD Studio и правильно работает. Я попытался переписать эту программу под Lazarus, однако тут возникают проблемы, связанные с тем, что интерфейсная dll пытается передавать в программу на Lazarus классы, а именно передается экземпляр класса LUnknown:

Код: Выделить всё
LUnknown = class
   function QueryInterface(const iid:TGUID; out ppv):HRESULT; virtual; stdcall; abstract;
   function AddRef:ULONG; virtual; stdcall; abstract;
   function Release:ULONG; virtual; stdcall; abstract;
end;                                                     


а затем вызовом функции QueryInterface этого класса извлекается ссылка на указатель класса IDaqLDevice = class(LUnknown)

Код: Выделить всё
type
IDaqLDevice = class(LUnknown)

   function inbyte (offset:ULONG; var data:UCHAR; len:ULONG; key:ULONG ):ULONG; virtual; stdcall; abstract;
   function inword (offset:ULONG; var data:USHORT; len:ULONG; key:ULONG):ULONG; virtual; stdcall; abstract;
   function indword(offset:ULONG; var data:ULONG; len:ULONG; key:ULONG ):ULONG; virtual; stdcall; abstract;

   function outbyte (offset:ULONG; var data:UCHAR; len:ULONG; key:ULONG ):ULONG; virtual; stdcall; abstract;
   function outword (offset:ULONG; var data:USHORT; len:ULONG; key:ULONG):ULONG; virtual; stdcall; abstract;
   function outdword(offset:ULONG; var data:ULONG; len:ULONG; key:ULONG ):ULONG; virtual; stdcall; abstract;

   // Working with MEM ports
   function inmbyte (offset:ULONG; var data:UCHAR; len:ULONG; key:ULONG ):ULONG; virtual; stdcall; abstract;
   function inmword (offset:ULONG; var data:USHORT; len:ULONG; key:ULONG):ULONG; virtual; stdcall; abstract;
   function inmdword(offset:ULONG; var data:ULONG; len:ULONG; key:ULONG ):ULONG; virtual; stdcall; abstract;

   function outmbyte (offset:ULONG; var data:UCHAR; len:ULONG; key:ULONG ):ULONG; virtual; stdcall; abstract;
   function outmword (offset:ULONG; var data:USHORT; len:ULONG; key:ULONG):ULONG; virtual; stdcall; abstract;
   function outmdword(offset:ULONG; var data:ULONG; len:ULONG; key:ULONG ):ULONG; virtual; stdcall; abstract;

   function GetWord_DM(Addr:USHORT; var Data:USHORT):ULONG; virtual; stdcall; abstract;
   function PutWord_DM(Addr:USHORT; Data:USHORT):ULONG; virtual; stdcall; abstract;
   function PutWord_PM(Addr:USHORT; Data:ULONG):ULONG; virtual; stdcall; abstract;
   function GetWord_PM(Addr:USHORT; var Data:ULONG):ULONG; virtual; stdcall; abstract;

   function GetArray_DM(Addr:USHORT; Count:ULONG; var Data:USHORT):ULONG; virtual; stdcall; abstract;
   function PutArray_DM(Addr:USHORT; Count:ULONG; var Data:USHORT):ULONG; virtual; stdcall; abstract;
   function PutArray_PM(Addr:USHORT; Count:ULONG; var Data:ULONG):ULONG; virtual; stdcall; abstract;
   function GetArray_PM(Addr:USHORT; Count:ULONG; var Data:ULONG):ULONG; virtual; stdcall; abstract;

   function SendCommand(Cmd:USHORT):ULONG; virtual; stdcall; abstract;

   function PlataTest:ULONG; virtual; stdcall; abstract;

   function GetSlotParam(var slPar:SLOT_PAR):ULONG; virtual; stdcall; abstract;

   function OpenLDevice:THandle; virtual; stdcall; abstract;
   function CloseLDevice:ULONG; virtual; stdcall; abstract;

///
   function SetParametersStream(var ap:DAQ_PAR; var UsedSize:ULONG; out Data; out Sync; StreamId:ULONG):ULONG; virtual; stdcall; abstract;
   function RequestBufferStream(var Size:ULONG; StreamId:ULONG):ULONG; virtual; stdcall; abstract; //in words
   function FillDAQparameters(var ap:DAQ_PAR):ULONG; virtual; stdcall; abstract;
///

   function InitStartLDevice:ULONG; virtual; stdcall; abstract;
   function StartLDevice:ULONG; virtual; stdcall; abstract;
   function StopLDevice:ULONG; virtual; stdcall; abstract;

   function LoadBios(FileName:PAnsiChar):ULONG; virtual; stdcall; abstract;

{
   function InputADC(Chan:USHORT; var Data:USHORT):ULONG; virtual; stdcall; abstract;

   function InputTTL(var Data:ULONG; Mode:ULONG):ULONG; virtual; stdcall; abstract;
   function OutputTTL(Data:ULONG; Mode:ULONG):ULONG; virtual; stdcall; abstract;
   function ConfigTTL(Data:ULONG):ULONG; virtual; stdcall; abstract;

   function OutputDAC(Data:ShortInt; Mode:ULONG):ULONG; virtual; stdcall; abstract;
   function ConfigDAC(Mode:ULONG; Number:ULONG):ULONG; virtual; stdcall; abstract;
}

   function IoAsync(var sp:DAQ_PAR):ULONG; virtual; stdcall; abstract;

   function ReadPlataDescr(var pd):ULONG; virtual; stdcall; abstract;
   function WritePlataDescr(var pd; Ena:USHORT):ULONG; virtual; stdcall; abstract;
   function ReadFlashWord(FlashAddress:USHORT; var Data:USHORT):ULONG; virtual; stdcall; abstract;
   function WriteFlashWord(FlashAddress:USHORT; Data:USHORT):ULONG; virtual; stdcall; abstract;
   function EnableFlashWrite(Flag:USHORT):ULONG; virtual; stdcall; abstract;

   function EnableCorrection(Ena:USHORT):ULONG; virtual; stdcall; abstract;

   function GetParameter(name:ULONG; var param:ULONG):ULONG; virtual; stdcall; abstract;
   function SetParameter(name:ULONG; var param:ULONG):ULONG; virtual; stdcall; abstract;

   function SetLDeviceEvent(hEvent:THandle; EventId:ULONG):ULONG; virtual; stdcall; abstract;

end;                                                                 


Вот, как это выглядит в процедуре FormCreate программы:

Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
begin

  skip:=1;
   Timer1.Enabled:=False;
   Timer2.Enabled:=False;

   LockXY:= TCriticalSection.Create;

   Memo1.Lines.Clear;
   Memo1.Lines.Add('Testing library');
   if(CallCreateInstance('lcomp64.dll')=1) then
   begin
      Memo1.Lines.Add('Loading library - success.');
      Memo1.Lines.Add('');
   end;
{Укажите здесь виртуальный слот той платы с которой хотите работать}
   pIUnknown:=CreateInstance(slot);
   dec(PInteger(pIUnknown)^, sizeof(TVmt));
   // Уменьшаем указатель на размер VMT
   hr := pIUnknown.QueryInterface(IID_ILDEV,pLDev);
   if(not Succeeded(hr)) then MessageBox(0,'Get interface failed','Error',MB_OK);
   inc(PInteger(pIUnknown)^, sizeof(TVmt)); //Перед освобождением памяти
   // возвращаем значение указателя
   pIUnknown.Release;
   dec(PInteger(pLDev)^, sizeof(TVmt)); // то же проделываем с указателем pLDev
   dev:=pLDev.OpenLDevice;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   data:=NIL;
   sync:=NIL;
   Timer1.Enabled:=False;
   Timer2.Enabled:=False;
   pLDev.StopLDevice;
   pLDev.CloseLDevice;
   inc(PInteger(pLDev)^, sizeof(TVmt)); // возвращаем значение указателя pLDev
   pLDev.Release;
   LockXY.Free;
end;                                   
                                 


Здесь мне пришлось уже несколько модифицировать эту процедуру в соответствии с рекомендациями, почерпнутыми из ссылки, упомянутой в начале (иначе получаю ошибку sigsegv), а именно я уменьшил указатели на точку входа pIUnknown и pLDev на размер VMT таблицы Lazarus'а (соответственно перед освобождением памяти вернул прежние значения этих указателей). В результате удалось загрузить оба этих класса, но при попытке использовать методы класса pLDev возникает ошибка:

Код: Выделить всё
pLDev.GetSlotParam(sl); // здесь читает правильно

   Memo1.Lines.Add('');
   Memo1.Lines.Add('Slot parameters');
   Memo1.Lines.Add('Base - '+IntToHex(sl.Base,4));
   Memo1.Lines.Add('BaseL - '+IntToHex(sl.BaseL,4));
   Memo1.Lines.Add('Mem - '+IntToHex(sl.Mem,8));
   Memo1.Lines.Add('MemL - '+IntToHex(sl.MemL,8));
   Memo1.Lines.Add('Type - '+IntToStr(sl.BoardType));
   Memo1.Lines.Add('DSPType - '+IntToStr(sl.DSPType));
   Memo1.Lines.Add('Irq - '+IntToStr(sl.Irq));
   Memo1.Lines.Add('');                             


и далее:

Код: Выделить всё
s:=IntToStr(pLDev.LoadBios('e440'));          {no bios needed}
           Memo1.Lines.Add('LoadBios status '+s);
           s:=IntToStr(pLDev.ReadPlataDescr(pd)); // Ошибка !!!
           Memo1.Lines.Add('ReadPlataDescr status '+s);

           Memo1.Lines.Add('');
           Memo1.Lines.Add('Serial Num. '+pd.t5.SerNum);
           Memo1.Lines.Add('Board Name '+pd.t5.BrdName);
           Memo1.Lines.Add('Revision '+pd.t5.Rev);
           Memo1.Lines.Add('DSP Type '+pd.t5.DspType);
           Memo1.Lines.Add('Quartz '+IntToStr(pd.t5.Quartz));         


на первой картинке результат работы программы на Lazarus

[img]
Изображение лазерная эпиляция
[img]
На второй Delphi
[img]
Изображение лазерная эпиляция
[/img]

Судя по этим картинкам программа на Lazarus полностью отрабатывает процедуру pLDev.GetSlotParam(sl) правильно определяет тип платы (31 это код именно E14-140) и распределение памяти, но уже при попытке загрузить описание платы pLDev.ReadPlataDescr(pd) возникает ошибка.

Дополнения:

1. Хотя интерфейсный класс pIUnknown похож на соответствующий класс com интерфейса, но это не com интерфейс,

pLDev: IDaqLDevice;
pIUnknown:LUnknown;

2. sl:SLOT_PAR; определен в модуле ioctl, как

Код: Выделить всё
SLOT_PAR = object
public
   Base      : ULONG;
   BaseL     : ULONG;
   Base1     : ULONG;
   BaseL1    : ULONG;
   Mem       : ULONG;
   MemL      : ULONG;
   Mem1      : ULONG;
   MemL1     : ULONG;
   Irq       : ULONG;
   BoardType : ULONG;
   DSPType   : ULONG;
   Dma       : ULONG;
   DmaDac    : ULONG;
   DTA_REG   : ULONG;
   IDMA_REG  : ULONG;
   CMD_REG   : ULONG;
   IRQ_RST   : ULONG;
   DTA_ARRAY : ULONG;
   RDY_REG   : ULONG;
   CFG_REG   : ULONG;
end;
PSLOT_PAR = ^SLOT_PAR;


pd: PLATA_DESCR_U2; определен в модуле ioctl, как

Код: Выделить всё
PLATA_DESCR_U2 = record
   case Integer of
      0: (t1:PLATA_DESCR);
      1: (t2:PLATA_DESCR_1450);
      2: (t3:PLATA_DESCR_L791);
      3: (wi:WORD_IMAGE_256);
      4: (bi:BYTE_IMAGE_256);
      5: (t4:PLATA_DESCR_E440);
      6: (t5:PLATA_DESCR_E140);
      7: (t6:PLATA_DESCR_E2010);
      8: (t7:PLATA_DESCR_E154);

end;                           


соответственно PLATA_DESCR_E140 определяется, как:

Код: Выделить всё
PLATA_DESCR_E140 = object
public
   SerNum       : array [0..8] of CHAR;
   BrdName      : array [0..10] of CHAR;
   Rev          : CHAR;
   DspType      : array [0..10] of CHAR;
   IsDacPresent : CHAR;
   Quartz       : ULONG;
   Reserv2      : array [0..2] of UCHAR;
   KoefADC      : array [0..7] of single;
   KoefDAC      : array [0..3] of single;
   Custom       : array [0..19] of USHORT;
end;
PPLATA_DESCR_E140 = ^PLATA_DESCR_E140;       


Я понимаю, что, возможно изменения указателей на точку входа класса еще недостаточно и надо бы как то модифицировать VMT таблицу класса, но знаний не хватает, поэтому прошу Вашего (или ваших) советов. Конечно, можно было бы просто плюнуть на всё и продолжить работать в Delphi, но уж очень обидно, тем более, что Lazarus объективно лучше.
vitaliper54
новенький
 
Сообщения: 11
Зарегистрирован: 03.05.2021 21:19:56

Re: Получение класса из C++ dll

Сообщение скалогрыз » 31.05.2021 00:50:31

1) нафига объявлять С++ Классы как Паскаль классы?
судя по коду это интерфейсы, и тем более это COM интерфейсы. Почему сразу интерфейсом не объявить?
2) может быть вместо того, чтобы пытаться достучаться до Си++классов, лучше написать для них Си-обрётки? так будет често и надёжно!
скалогрыз
долгожитель
 
Сообщения: 1793
Зарегистрирован: 03.09.2008 02:36:48

Re: Получение класса из C++ dll

Сообщение Alex2013 » 31.05.2021 01:37:30

Для меня довольно актуально OpenVR библиотека классов на С++ что для доступа из паскаля реальный страх и ужос !
(Как там только не выкручиваются.... )
http://source.oriolussoftware.de/openvr.html
https://github.com/BeRo1985/pasvulkan/b ... OpenVR.pas
https://github.com/Kagamma/OpenVR-Pasca ... vr_api.pas
Alex2013
долгожитель
 
Сообщения: 2207
Зарегистрирован: 03.04.2013 11:59:44

Re: Получение класса из C++ dll

Сообщение Vadim » 31.05.2021 03:01:49

Поддержу пост про Си-обёртку.
Пару-тройку лет назад делал на Lazarus'е прогу, которая работает RFID-антенами. Там разработчики тоже на какой-то фиг сделали драйвер на Си++ классах. С ней работать не получилось даже на Дельфях, поэтому была написана Си-обёртка, которая выдаёт чистые функции, через которые уже работает моя прога. В результате драйвер компилируется Си++нутым компилятором, но паскалевский интерфейс с таким многослойным пирогом (Си++нутые классы -> функциональная обёртка -> паскальный интерфейс) уже работает без проблем.
Vadim
долгожитель
 
Сообщения: 3980
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Получение класса из C++ dll

Сообщение Alex2013 » 31.05.2021 07:52:35

Vadim писал(а):Поддержу пост про Си-обёртку.
Пару-тройку лет назад делал на Lazarus'е прогу, которая работает RFID-антенами. Там разработчики тоже на какой-то фиг сделали драйвер на Си++ классах. С ней работать не получилось даже на Дельфях, поэтому была написана Си-обёртка, которая выдаёт чистые функции, через которые уже работает моя прога. В результате драйвер компилируется Си++нутым компилятором, но паскалевский интерфейс с таким многослойным пирогом (Си++нутые классы -> функциональная обёртка -> паскальный интерфейс) уже работает без проблем.

Есть нюанс: если можешь написать толковую "обертку на Си ++" то к чему вообще писать на паскале ? К тому-же не всегда функционал класса Си++ можно честно засунуть в "голые" функции .
Alex2013
долгожитель
 
Сообщения: 2207
Зарегистрирован: 03.04.2013 11:59:44

Re: Получение класса из C++ dll

Сообщение скалогрыз » 31.05.2021 08:49:11

Alex2013 писал(а):то к чему вообще писать на паскале

чтобы не знать крестопроблем, очевидно. Написал один раз и всё! отдыхаешь, наслаждаешься нормальным языком программирования

Alex2013 писал(а):К тому-же не всегда функционал класса Си++ можно честно засунуть в "голые" функции

только в тех случаях, когда потребуется наследование. Очень часто классы используются лишь как интерфейсная часть, без необходимости делать наследников.
скалогрыз
долгожитель
 
Сообщения: 1793
Зарегистрирован: 03.09.2008 02:36:48

Re: Получение класса из C++ dll

Сообщение Vadim » 31.05.2021 16:12:09

Alex2013 писал(а):"обертку на Си ++"

Во-первых, обёртку не на Си++, а на Си. ;-)
Alex2013 писал(а):... то к чему вообще писать на паскале ?

Потому что мне Си не нравится. ;-) :D
Вот Вы сейчас начнёте усердно вопрошать - "какие ващи доказателства". А сами то на чём пишете? Вот и доказательства. :-D
Тут ведь даже ежу понятно - если ничего другого, кроме исходника Си++ нет, то нужно ли обязательно сидеть целый год, писать дрова на Паскале, когда можно взять из уже готового класса только то, что тебе нужно и не парится? ;-)
Vadim
долгожитель
 
Сообщения: 3980
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Получение класса из C++ dll

Сообщение vitaliper54 » 31.05.2021 19:32:30

Если бы я мог написать Си-обертку, я бы и работал в Си и не заморачивался такими проблемами. На самом деле исходники на C++ имеются, но, поскольку я имею весьма слабые представления о C++, то даже перекомпилировать там, что-либо не решаюсь.
То есть для меня эта сишная dll некий черный ящик и просто пытаюсь извлечь из нее то, что мне нужно. Если на Delphi это всё работает, то значит информация передается, кроме того некоторые подпрограммы удается запустить даже в Lazarus'е.
Я так понимаю, что, поскольку конструктор класса находится во внешней dll, то и вся служебная информация класса (VMT и т.д.) соответствует формату
служебной информации класса Delphi (иначе бы и в Delphi программа не работала), какие то несоответствия Lazarus'а и Delphi я выявил, например они
отличаются точкой входа, которая у Lazarus'а смещена на размер VMT, есть и другие отличия, но я пока не представляю, как в Lazarus'е переформатировать таблицу VMT класса нужным образом.
Насчет обертки, эту идею можно попробовать, у LCard имеется что то подобное под labview библиотека wlcomp она вроде написана на чистом Си (не C++), но к нему нет паскалевского интерфейса, попробую запросить на форуме Lcard. Если получится сообщу.
vitaliper54
новенький
 
Сообщения: 11
Зарегистрирован: 03.05.2021 21:19:56

Re: Получение класса из C++ dll

Сообщение скалогрыз » 01.06.2021 17:30:41

vitaliper54 писал(а): Если на Delphi это всё работает,

есть ли вариант что в Delphi не то чтобы всё работает, а просто удачно не падает?

vitaliper54 писал(а):Я так понимаю, что, поскольку конструктор класса находится во внешней dll, то и вся служебная информация класса (VMT и т.д.) соответствует формату служебной информации класса Delphi

в ссылке на тему которую ты дал в первом посте говорится что dll-ка собрана на VisualC++. Это майкрсофт. Там VMT никак не Delphi.
В лучшем случае, если dll-ка собрана на Builder C++, тогда да, что-то совместимое с Delphi там будет.
Но ты точно знаешь ЧЕМ была собрана dll-ка?

вместо лишних вопросов я пошёл на официальный сайт
что хорошо, есть руководство программиста

Вот, что ты можешь попробовать сделать.
1) не используй Class, вместо него используй Interface.
2) объяви интерфейсы в своём модуле как CORBA. {$INTERFACES CORBA}
3) не используй object (как например в PLATA_DESCR_E140), только record-ы
Код: Выделить всё
{$INTERFACES CORBA}

LUnknown = interface
   function QueryInterface(const iid:TGUID; out ppv):HRESULT; stdcall;
   function AddRef:ULONG; stdcall;
   function Release:ULONG; stdcall;
end; 

IDaqLDevice = interface(LUnknown)
   function inbyte (offset:ULONG; var data:UCHAR; len:ULONG; key:ULONG ):ULONG; stdcall;
   function inword (offset:ULONG; var data:USHORT; len:ULONG; key:ULONG):ULONG; stdcall;
   ...

скалогрыз
долгожитель
 
Сообщения: 1793
Зарегистрирован: 03.09.2008 02:36:48

Re: Получение класса из C++ dll

Сообщение vitaliper54 » 01.06.2021 18:11:09

Спасибо за ответ, но этот ответ предполагает необходимость перекомпилирования исходной dll-ки, что я пока боюсь делать,
там довольно объемная программа причем я эту программу на C++ не понимаю. Кроме того непонятно, чем компилировать?
Можно ли использовать codeblocks?
vitaliper54
новенький
 
Сообщения: 11
Зарегистрирован: 03.05.2021 21:19:56

Re: Получение класса из C++ dll

Сообщение скалогрыз » 01.06.2021 18:12:07

наоборот, ничего не надо перекомпилировать.
меняем только паскаль код.
скалогрыз
долгожитель
 
Сообщения: 1793
Зарегистрирован: 03.09.2008 02:36:48

Re: Получение класса из C++ dll

Сообщение vitaliper54 » 01.06.2021 20:30:54

Спасибо, попробую.

Добавлено спустя 43 минуты 44 секунды:
Действительно, с интерфейсами модуль загружается без этих танцев с бубнами с указателями, с объектами не всё так просто, там в некоторых случаях имеется наследование, например:

Код: Выделить всё
DAQ_PAR = object
public
   s_Type  : ULONG;
   FIFO    : ULONG;
   IrqStep : ULONG;
   Pages   : ULONG;
end;
PDAQ_PAR = ^DAQ_PAR;

ASYNC_PAR = object (DAQ_PAR)
public
   dRate : double;
   Rate  : ULONG;
   NCh   : ULONG;
   Chn   : array [0..127] of ULONG;
   Data  : array [0..127] of ULONG;
   Mode  : ULONG;
end;
PASYNC_PAR = ^ASYNC_PAR;         


Компилятор на это ругается, а, если оставить объекты ничего не получается.
Но буду разбираться, как в таких случаях заменять object на record. В общем буду разбираться.

Вам спасибо!!!

Добавлено спустя 25 минут 29 секунд:
С interface вместо class загружает, но перестает правильно определять тип платы

[img][IMG]https://cdn1.savepice.ru/uploads/2021/6/1/df80ca6cb85a55b78868f6ec8ab6484b-full.jpg[/img] лазерная эпиляция[/img]

да и с распределением памяти не всё в порядке, сравните с предыдущей картинкой. Причем это независимо от того, определяю ли я
SLOT_PAR, как object или record. Так, что не всё так просто, но всё равно спасибо.

Добавлено спустя 5 минут 6 секунд:
где то ошибся, высылаю еще раз

С interface вместо class загружает, но перестает правильно определять тип платы

Изображение

да и с распределением памяти не всё в порядке, сравните с предыдущей картинкой. Причем это независимо от того, определяю ли я
SLOT_PAR, как object или record. Так, что не всё так просто, но всё равно спасибо.
vitaliper54
новенький
 
Сообщения: 11
Зарегистрирован: 03.05.2021 21:19:56

Re: Получение класса из C++ dll

Сообщение скалогрыз » 01.06.2021 21:58:57

нужен код и formCreate
т.е. как сейчас получается интерфейс и запрашивается информация
скалогрыз
долгожитель
 
Сообщения: 1793
Зарегистрирован: 03.09.2008 02:36:48

Re: Получение класса из C++ dll

Сообщение Alex2013 » 01.06.2021 23:30:38

1
vitaliper54 писал(а): но к нему нет паскалевского интерфейса, попробую запросить на форуме Lcard. Если получится сообщу.

Ну это дело легко поправимое если есть Си-шный хедер ( *.h ) то его можно транслировать в паскаль утилитами h2pas.exe h2paspp.exe из X:\lazarus\fpc\3.2.0\bin\x86_64-win64 .
Alex2013
долгожитель
 
Сообщения: 2207
Зарегистрирован: 03.04.2013 11:59:44

Re: Получение класса из C++ dll

Сообщение vitaliper54 » 02.06.2021 00:27:33

C++ не берет, а Си чистый попробую, я сейчас пробую договориться с разработчиком LComp, он вышел на меня на LCard'овском форуме, обещает помочь с враппером на WLComp, если ему дадут на это тикер.
vitaliper54
новенький
 
Сообщения: 11
Зарегистрирован: 03.05.2021 21:19:56

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google Adsense [Bot] и гости: 14

Рейтинг@Mail.ru