Создание DLL (Различается между Lazarus и Delphi)

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

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

Аватара пользователя
whs
новенький
Сообщения: 28
Зарегистрирован: 03.04.2010 18:07:44

Создание DLL (Различается между Lazarus и Delphi)

Сообщение whs »

Есть исходник написанной DLL на Delphi 7, возникла необходимость перенести на Lazarus. Все компилируется но вот вызвать из программы Окно из своей DLL не получается, либо ничего не происходит (функции ничего не возвращают будто не экспортируются), либо Access Violation. Перелопатил весь интернет пишут что вроде отличие в сборке самой DLL у них это реализовано по разному(ничему не удивлен). но возникает вопрос как собрать совместимую и рабочую DLL.
alexey38
долгожитель
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Сообщение alexey38 »

Попробуйте динамическое подключение, тогда будет ясно хотя бы правильность имен функций.
NTFS
постоялец
Сообщения: 388
Зарегистрирован: 05.11.2007 13:57:50
Откуда: Краснодар
Контактная информация:

Сообщение NTFS »

Даже в Delphi вызов классов VCL из dll вызывал много вопросов и проблем. В Lazarus - это очень сложно, потому что:
1) LCL гораздо более "тяжелый" и менее стабильный, чем VCL.
2) Компиляция dll в FreePascal - вообще очень проблемная задача. Собрать-то можно, но вот работоспособность никто не гарантирует :-) ЕМНИП, даже блоки try-except в dll не работают.
Рекомендую либо пересмотреть логику проекта, чтобы не вызывать формы из dll, либо готовиться к долгой и веселой гребле.

Добавлено спустя 2 минуты 42 секунды:
Только что проверил простейшим тестом. Блок try -except в dll просто игнорируется. Пробивает аж до уровня хост-приложения. В Delphi тот же код прекрасно работает. Увы.
Аватара пользователя
whs
новенький
Сообщения: 28
Зарегистрирован: 03.04.2010 18:07:44

Сообщение whs »

NTFS писал(а):Даже в Delphi вызов классов VCL из dll вызывал много вопросов и проблем. В Lazarus - это очень сложно, потому что:
1) LCL гораздо более "тяжелый" и менее стабильный, чем VCL.
2) Компиляция dll в FreePascal - вообще очень проблемная задача. Собрать-то можно, но вот работоспособность никто не гарантирует :-) ЕМНИП, даже блоки try-except в dll не работают.
Рекомендую либо пересмотреть логику проекта, чтобы не вызывать формы из dll, либо готовиться к долгой и веселой гребле.

Добавлено спустя 2 минуты 42 секунды:
Только что проверил простейшим тестом. Блок try -except в dll просто игнорируется. Пробивает аж до уровня хост-приложения. В Delphi тот же код прекрасно работает. Увы.


1) Насчет его нестабильности это известный факт.
2) Да я уже это понял, в любом случае гребля будет.
Рекомендация хорошая, только логику не изменить DLL цепляется в сторонний программный комплекс и там внутри реализовано это в виде С подобных скриптов, свободы мало.
Как вариант попробовать передачу в виде исполняемого приложения, либо переписать DLL в Dev-C++ или CodeBlocks или что там есть открытое но стабильное? :D
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

whs писал(а):...либо переписать DLL в Dev-C++ или CodeBlocks или что там есть открытое но стабильное? :D

TurboDelphi
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

dunin писал(а):TurboDelphi


Нету больше этой халявы
"Turbo Delphi is no longer available. We invite you to learn more about the latest version of Delphi and download a free trial"

...и никогда больше не будет халявы от эмбаркадеро.
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

Нет новых ответов по поводу компиляции библиотеки правильно?
Аватара пользователя
Максим
энтузиаст
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Сообщение Максим »

Скажите, а зачем вы откапываете старые треды?

По сути вопроса: пользуйтесь FPC 2.7.1.
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

Максим писал(а):Скажите, а зачем вы откапываете старые треды?

А смысл плодить море одинаковых тем, когда проблема та же что и в теме? Да и по поиску проще находить.
Если библиотека компилируется без ошибок, а loadLibrary не грузит ее, то у меня вот не хватает мозгов, чтобы прочитать мысли компа в момент прохождения loadLibrary и найти ошибку.

Пока докопался что пустую Dll конектить можно, а как дело до взятия значения константы из моего модуля, то финиш.


2.7.1 - не стабильный как я понимаю, судя по тому что 2.6.2 на сайте красуется.
Аватара пользователя
Максим
энтузиаст
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Сообщение Максим »

Sharfik писал(а):А смысл плодить море одинаковых тем, когда проблема та же что и в теме? Да и по поиску проще находить.

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

Sharfik писал(а):2.7.1 - не стабильный как я понимаю, судя по тому что 2.6.2 на сайте красуется.

Вам проблемы решать или потеоретизировать?
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

Максим писал(а):Вам проблемы решать или потеоретизировать?

Теорию тоже знать надо.
Ладно, не суть. Спасибо, вроде заработало, не сразу правда, но надеюсь больше не будет проблем.
Аватара пользователя
zoltanleo
постоялец
Сообщения: 459
Зарегистрирован: 17.10.2013 10:55:01

Сообщение zoltanleo »

Sharfik писал(а):вроде заработало, не сразу правда, но надеюсь больше не будет проблем

решением поделиться со всеми нет желания?
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

zoltanleo писал(а):
Sharfik писал(а):вроде заработало, не сразу правда, но надеюсь больше не будет проблем

решением поделиться со всеми нет желания?

Это грустная история.
Стоял Lazarus 1.0 с fpc 2.6.2, тот что считается последним стабильным.
Функции загрузки Dll работают на ура, но не с библиотеками скомпилированными этим же lazarus. Очень не хотелось, но поставил по совету Максима - fpc 2.7.1, точнее я его нашел, скачал, скомпилировал, а дальше с IDE 1.0 он отказался работать, находя кучу ошибок в модулях которые до этого собирались.
Пришлось скачать Lazarus 1.1 c fpc 2.7.1, на нем dll скомпилировалось без проблем и основная программа ее увидела. И примитивные проверки прошли тестирование. Дальше я завяз пока что, потому что указанная версия IDE из-за непонятной ошибки неожиданного конца файла одного из модулей отказывается добавлять процедуры в код, когда кликаешь дважды по новой кнопке. Вылечил пока что через одно место, сижу с главным приложением вожусь, перенося в него проект. Dll чуть позже буду препарировать. Codetyphon последний так же как lazarus 1.1 себя ведет.

Ну и конечно, dll должны быть той же разрядности что и сама программа их загружающая. Если win32, то win32.

PS: Не могу понять о чем речь, когда говорят что fpc не умеет обрабатывать ошибки в коде dll. Делал тест, в try except засовывал подключение к программе сторонней и если его нет, то там ошибка вываливается. Вот креша программы не было, обработалось все как надо.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Речь о том, что исключение, возникшее в коде dll, обрабатывается программой и его невозможно поймать в самой dll. Если при этом нужно просто показать сообщение об ошибке, то особой разницы нет, но если dll использует исключения в своей логике - все становится очень грустно.
Аватара пользователя
Максим
энтузиаст
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Сообщение Максим »

Sharfik писал(а):указанная версия IDE из-за непонятной ошибки неожиданного конца файла одного из модулей отказывается добавлять процедуры в код, когда кликаешь дважды по новой кнопке

Ну, во-первых, версия 1.1 - это что-то уж очень старое. Сейчас модно использовать 1.2RC2 либо выше.
Во-вторых, пункт меню "Сервис" -> "Пересмотреть каталог исходного кода FPC" должен спасти отца русской демократии. Разумеется, исходный код компилятора должен соответствовать его используемой версии.
Ответить