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

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

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

Alex2013
долгожитель
Сообщения: 3212
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Еще в поставке Лазаруса есть пакет 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.
Но он вроде был весьма кривой. :(
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

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

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

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

на
SLOT_PAR = packed record

должно помочь!
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

В своё время, когда делал паскалевские интерфейсы для OpenMPI и MPICH (тоже MPI, только у него интерфейсная часть попроще), перепробовал штук 6 преобразователей из Си (только *.h-файлы) и ни один нормально не переводит. В результате пришлось делать свой конвертер, потому что Сишного кода целый вагон, руками делать - пару веков на это потратишь. :-)
Правда свой конвертер я до самодостаточности так и не довёл - он у меня последовательно разные типы переводит, т.е. за один сеанс (запуск) какой-то определённый тип типов ( :-) ).
Alex2013
долгожитель
Сообщения: 3212
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Вообще-то все забыли, но первые версии Лазаруса вроде как транслировали код на паскале в промежуточный Си++ код для GCC... :idea:
vitaliper54
новенький
Сообщения: 11
Зарегистрирован: 03.05.2021 20:19:56

Сообщение vitaliper54 »

Попробовал, не помогает, но понятно, что пишется не туда, приложение 64-х битное
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

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 собирался с помощью делфи, но со временем такая возможность была утерена.
vitaliper54
новенький
Сообщения: 11
Зарегистрирован: 03.05.2021 20:19:56

Сообщение vitaliper54 »

Вот для Delphi

Изображение

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

Изображение

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

Изображение

В Lazarus'е с интерфейсами его размер удваивается, было 80,
стало 160
Alex2013
долгожитель
Сообщения: 3212
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

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

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


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

Сообщение скалогрыз »

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

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

а версия FPC какая у тебя?
vitaliper54
новенький
Сообщения: 11
Зарегистрирован: 03.05.2021 20:19:56

Сообщение vitaliper54 »

версия FPC 3.2.0, sizeof(ULONG) = 8
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

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

а вот этого быть не должно... он где-то переопределён в исходниках?
vitaliper54
новенький
Сообщения: 11
Зарегистрирован: 03.05.2021 20:19:56

Сообщение vitaliper54 »

А в Delphi sizeof(ULONG) = 4
Alex2013
долгожитель
Сообщения: 3212
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Возможно все-же что-то полезное из опыта по трансляции этого "чудовища" все же пригодится ?
(Код компилится под 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 21:14:10, всего редактировалось 1 раз.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

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


у тебя явно где-то ULONG переопределён.
потому что в FPC 3.2.0 ULONG объявлен как

Код: Выделить всё

ULONG  = cardinal; 

это 4 байта.

в ioctl есть что-то вроде

Код: Выделить всё

ULONG = qword;

или

Код: Выделить всё

ULONG = ptruint;

?
vitaliper54
новенький
Сообщения: 11
Зарегистрирован: 03.05.2021 20:19:56

Сообщение vitaliper54 »

Но я же ничего не менял в исходниках, разве, что {$INTERFACES CORBA} дурит, ладно буду разбираться
Ответить