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

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

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

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

Сообщение Alex2013 » 02.06.2021 00:46:24

Еще в поставке Лазаруса есть пакет LazActiveX (Неуверен что годится для всего но вещь крайне любопытная )
https://wiki.freepascal.org/LazActiveX

Добавлено спустя 18 минут 49 секунд:
Еще есть пакет lazC (IDE extensions for C sources and compilers)
X:lazaruscomponentscompilersc
.(не совсем понятно что делает но вроде учит ИДЕ лазаруса понимать Си напрямую ) :idea:
msgid "GNU project C and C++ compiler"
msgstr "Компилятор C и C++ проекта GNU"
:shock:

Добавлено спустя 17 минут 52 секунды:
Упс !!!
https://github.com/aababilov/pas2cpp
Настоящий переводчик принимает на вход файл с синтаксически корректным и семантически произвольным кодом на Pascal (Delphi), не требует НИКАКИХ модулей, указанных в списке uses, и выдает .cpp (либо пару .cpp/.h для unit) файл с эквивалентным кодом на C++ (Для создания "оберток" при слабом понимании С++ самое то !)

Еще есть https://sourceforge.net/projects/c2pas/ OpenC2Pas is a C/C++/BCB to Object Pascal (Delphi/Kylix) translator.
Но он вроде был весьма кривой. :(
Alex2013
долгожитель
 
Сообщения: 2940
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение скалогрыз » 02.06.2021 03:29:09

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

всё нормально он определяет. Потому что у тебя выводится в Mem $1F
это как раз тип (Type) 31
у тебя где-то смещение произошло на 16 байт?! я так понимаю приложие 64-битное?!

попробоуй поменять объявление
с
SLOT_PAR = object
public

на
SLOT_PAR = packed record

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

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

Сообщение Vadim » 02.06.2021 15:45:48

Alex2013 писал(а):Но он вроде был весьма кривой.

В своё время, когда делал паскалевские интерфейсы для OpenMPI и MPICH (тоже MPI, только у него интерфейсная часть попроще), перепробовал штук 6 преобразователей из Си (только *.h-файлы) и ни один нормально не переводит. В результате пришлось делать свой конвертер, потому что Сишного кода целый вагон, руками делать - пару веков на это потратишь. :-)
Правда свой конвертер я до самодостаточности так и не довёл - он у меня последовательно разные типы переводит, т.е. за один сеанс (запуск) какой-то определённый тип типов ( :-) ).
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение Alex2013 » 02.06.2021 19:50:29

Вообще-то все забыли, но первые версии Лазаруса вроде как транслировали код на паскале в промежуточный Си++ код для GCC... :idea:
Alex2013
долгожитель
 
Сообщения: 2940
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение vitaliper54 » 02.06.2021 19:56:00

Попробовал, не помогает, но понятно, что пишется не туда, приложение 64-х битное
vitaliper54
новенький
 
Сообщения: 11
Зарегистрирован: 03.05.2021 21:19:56

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

Сообщение скалогрыз » 02.06.2021 20:12:34

vitaliper54 писал(а):Попробовал, не помогает, но понятно, что пишется не туда, приложение 64-х битное

выведи куда-нить на экран sizeof(SLOT_PAR) для Делфи и Лазаруса.
очень интересно посмотреть.

(соответственно для Лазаруса нужно сделать sizeof(SLOT_PAR) когда он объявлен как object, и отдельно когда он объявлен как packed record)

Код: Выделить всё
var
  obj: SLOT_PAR;
begin
  Memo1.Lines.Add( INtToStr(sizeof(SLOT_PAR)));
  Memo1.Lines.Add( Format('%s: %d',  ['base'      , Ofs(obj.base     ) - Ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['BaseL'     , ofs(obj.BaseL    ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['Base1'     , ofs(obj.Base1    ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['BaseL1'    , ofs(obj.BaseL1   ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['Mem'       , ofs(obj.Mem      ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['MemL'      , ofs(obj.MemL     ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['Mem1'      , ofs(obj.Mem1     ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['MemL1'     , ofs(obj.MemL1    ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['Irq'       , ofs(obj.Irq      ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['BoardType' , ofs(obj.BoardType) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['DSPType'   , ofs(obj.DSPType  ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['Dma'       , ofs(obj.Dma      ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['DmaDac'    , ofs(obj.DmaDac   ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['DTA_REG'   , ofs(obj.DTA_REG  ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['IDMA_REG'  , ofs(obj.IDMA_REG ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['CMD_REG'   , ofs(obj.CMD_REG  ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['IRQ_RST'   , ofs(obj.IRQ_RST  ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['DTA_ARRAY' , ofs(obj.DTA_ARRAY) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['RDY_REG'   , ofs(obj.RDY_REG  ) - ofs(obj)]));
  Memo1.Lines.Add( Format('%s: %d',  ['CFG_REG'   , ofs(obj.CFG_REG  ) - ofs(obj)]));
end;


для packed record нужно ещё объявить:
Код: Выделить всё
{$PACKRECORDS 1}


Alex2013 писал(а):Вообще-то все забыли, но первые версии Лазаруса вроде как транслировали код на паскале в промежуточный Си++ код для GCC...

все это забыли, потому что такого не было никогда.
Лазарус никогда ничего сам не транслировал, а всегда работал через FPC
FPC никогда не писал никакого Си кода. Было одно время, когда FPC собирался с помощью делфи, но со временем такая возможность была утерена.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение vitaliper54 » 02.06.2021 21:47:02

Вот для Delphi

Изображение

Для Lazarus'а, когда SLOT_PAR - object

Изображение

то же самое, когда он packed record

Изображение

В Lazarus'е с интерфейсами его размер удваивается, было 80,
стало 160
vitaliper54
новенький
 
Сообщения: 11
Зарегистрирован: 03.05.2021 21:19:56

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

Сообщение Alex2013 » 02.06.2021 21:48:13

скалогрыз писал(а):
Alex2013 писал(а):Вообще-то все забыли, но первые версии Лазаруса вроде как транслировали код на паскале в промежуточный Си++ код для GCC...

все это забыли, потому что такого не было никогда.
Лазарус никогда ничего сам не транслировал, а всегда работал через FPC
FPC никогда не писал никакого Си кода. Было одно время, когда FPC собирался с помощью делфи, но со временем такая возможность была утеряна.


Возможно я путаю с ранними версиями самого FPC или с "безвременно почившим" режимом GPC (или им самим ) но я точно сталкивался с "Препроцессорным Паскалем" (первый раз кажется еще на древне-советской Электронике 85 но и на более современных ПК тоже попадался).
Кстати современный FPC тоже листинг может генерить правда на асме.
-a The compiler does not delete the generated assembler file
...
Последний раз редактировалось Alex2013 02.06.2021 21:55:33, всего редактировалось 2 раз(а).
Alex2013
долгожитель
 
Сообщения: 2940
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение скалогрыз » 02.06.2021 21:54:15

vitaliper54 писал(а):В Lazarus'е с интерфейсами его размер удваивается, было 80,
стало 160

выведи куда-нить sizeof(ULONG) походу дела он удваивается где-то :(

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

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

Сообщение vitaliper54 » 02.06.2021 22:00:03

версия FPC 3.2.0, sizeof(ULONG) = 8
vitaliper54
новенький
 
Сообщения: 11
Зарегистрирован: 03.05.2021 21:19:56

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

Сообщение скалогрыз » 02.06.2021 22:02:58

vitaliper54 писал(а):sizeof(ULONG) = 8

а вот этого быть не должно... он где-то переопределён в исходниках?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение vitaliper54 » 02.06.2021 22:04:17

А в Delphi sizeof(ULONG) = 4
vitaliper54
новенький
 
Сообщения: 11
Зарегистрирован: 03.05.2021 21:19:56

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

Сообщение Alex2013 » 02.06.2021 22:04:38

Возможно все-же что-то полезное из опыта по трансляции этого "чудовища" все же пригодится ?
(Код компилится под FPC 3.2.0 )
https://github.com/Kagamma/OpenVR-Pasca ... vr_api.pas
Все же в header-е там вполне класс передается ...
https://github.com/ValveSoftware/openvr ... s/openvr.h
Зы
В общем извиняюсь за то, что влез со своим непродуманными советами в область, где разбираюсь довольно слабо.
Но я чисто в порядке поддержки "мозгового штурма" и поднятия "уровня шума" .
Последний раз редактировалось Alex2013 02.06.2021 22:14:10, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2940
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение скалогрыз » 02.06.2021 22:08:07

скалогрыз писал(а):а вот этого быть не должно... он где-то переопределён в исходниках?


у тебя явно где-то ULONG переопределён.
потому что в FPC 3.2.0 ULONG объявлен как
Код: Выделить всё
ULONG  = cardinal;

это 4 байта.

в ioctl есть что-то вроде
Код: Выделить всё
ULONG = qword;

или
Код: Выделить всё
ULONG = ptruint;

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

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

Сообщение vitaliper54 » 02.06.2021 22:10:32

Но я же ничего не менял в исходниках, разве, что {$INTERFACES CORBA} дурит, ладно буду разбираться
vitaliper54
новенький
 
Сообщения: 11
Зарегистрирован: 03.05.2021 21:19:56

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

Рейтинг@Mail.ru