Модульность (DLL)

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

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

Модульность (DLL)

Сообщение Talker1 » 11.11.2013 18:15:48

Привет!
Возник вопрос как организовать модульность программируя в Lazarus, так чтобы это работало и в виндах и в линуксе?
В дельфях под винды я уже привычно пишу DLL-модули запихивая туда формы, отчеты, логику. Но в линуксе DLL нет. И хочется конечно чтобы не нужно было из-за этого сопровождать 2 разных проекта - один под винды и другой под линукс...
В общем, решал кто такую задачу? Какие есть идеи?
Последний раз редактировалось Talker1 14.11.2013 17:12:53, всего редактировалось 1 раз.
Аватара пользователя
Talker1
новенький
 
Сообщения: 54
Зарегистрирован: 16.07.2013 18:45:45

Re: Модульность

Сообщение hinst » 11.11.2013 18:25:21

Talker1 писал(а):пишу DLL-модули запихивая туда формы, отчеты, логику

Но зачем?
Talker1 писал(а):Но в линуксе DLL нет.

Там есть динамические библиотеки, расширение у них обычно .so. Есть модуль dylib в FPC (или dynlib). Вообще работа с динамическими бибилотеками в Windows и в линуксе практически одинаковая на 90%, только в расширении файлов разница наверное
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Модульность

Сообщение hovadur » 12.11.2013 09:18:03

Talker1 писал(а):Но в линуксе DLL нет.

Есть. Только расширение у них so. Программируются в лазарусе в linux точно так же, как и windows. Только собирая библиотеку в линуксе, лазарус будет генерировать расширение so, а в windows расширение dll.
Чтобы в линукс увидела программа собранную тобой библиотеку, надо указать к библиотеке путь в LD_LIBRARY_PATH, или положить библиотеку в системные каталоги /usr/lib.

Добавлено спустя 24 минуты 54 секунды:
Посмотри исходники ZenGL http://zengl.org/, если какие-то проблемы возникнут.
hovadur
постоялец
 
Сообщения: 116
Зарегистрирован: 31.01.2013 15:50:41

Re: Модульность

Сообщение Devel0 » 12.11.2013 11:16:24

Как альтернатива - lpk-пакеты вместо библиотек
Devel0
новенький
 
Сообщения: 66
Зарегистрирован: 24.07.2011 10:43:13

Re: Модульность

Сообщение Talker1 » 12.11.2013 11:55:14

hinst, hovadur
Спасибо большое, я то полагал что .so и .dll технологически сильно разные вещи. А в Лазарус работа с DLL аналогична работе в Дельфях или там есть свои особенности? Вообще, есть ли где-то примеры и/или документация для Лазарус на эту тему?

Devel0
LPK - это видимо аналог работы с DPL в Дельфи?
У меня был один проект на Дельфи, где требовалась модульность и как раз использовал DPL, но в дальнейшем я всегда работал с DLL - проще.
Но, возможно, работа с LPK не вызывает особых особых проблем? Есть где-то примеры в сети?
Аватара пользователя
Talker1
новенький
 
Сообщения: 54
Зарегистрирован: 16.07.2013 18:45:45

Re: Модульность

Сообщение hinst » 12.11.2013 13:11:00

LPK динамически не загружаются. Они позволяют разбить проект на логические части, но если внёс измненеие в LPK, то надо перекомпилировать проект, так как исполняемый файл в итоге получается один

Добавлено спустя 1 минуту 25 секунд:
работа с DLL в лазарусе аналогична как в Delphi. Принцип один и тот же - загружаешь бибилотеку и получаешь адреса функций, а потом можешь их вызывать. Можно брать функции LoadLibrary и GetProcAddress из модуля Windows либо из dynlibs
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Модульность

Сообщение Talker1 » 12.11.2013 18:45:42

hinst , спасибо за разьяснения. Будем ориентироваться на dll.

Добавлено спустя 18 часов 33 минуты 8 секунд:
Что-то не получается в вызывать DLL-ку.
Вот очень простой пример, который отлично работает в Дельфях (D7), но не хочет под Лазарусом.

FormInDLL.zip

Что я делаю неправильно?

Добавлено спустя 4 минуты 18 секунд:
Поясню - в проекте скомпилитрованном в Лазарусе, при вызове процедуры из DLL (тоже скомпиленном в Лазарусе), вылетает exception
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Talker1
новенький
 
Сообщения: 54
Зарегистрирован: 16.07.2013 18:45:45

Re: Модульность

Сообщение hinst » 13.11.2013 15:10:16

я примерно представляю, что можно сделать, чтобы заработало, но нужно будет много тупить...... а мне сейчас не очень хочется. Может быть если выдастся в ближайшем или не очень будущем куча свободного времени, попробую
В двух словах решение сводится к тому, чтобы попробовать это сделать по-другому :roll:
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Модульность

Сообщение Talker1 » 13.11.2013 16:08:24

Я сейчас тут поэкспериментировал с самыми разными варианами, не вылетает только если функция или процедура из DLL делает свою работу молча - без каких-то визуальных форм, сообщений и проч. :((
Аватара пользователя
Talker1
новенький
 
Сообщения: 54
Зарегистрирован: 16.07.2013 18:45:45

Re: Модульность

Сообщение Иван Шихалев » 14.11.2013 02:04:39

http://freepascal.ru/article/freepascal/20050522025034/
А самый простой способ — использовать везде модуль cmem. Но есть и другая проблема — дублирование корня классов. В принципе, это решается вынесением в библиотеку RTL посредством ppumove...
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Модульность

Сообщение Talker1 » 14.11.2013 11:23:11

Разобрался почему мой пример не работает - в процедуре показа формы из DLL нужно было дописать Application.Initialize;
Пол-дня убил на эту ерунду..

Иван Шихалев а где-то можно прочитать про этот cmem ?

Добавлено спустя 47 минут 38 секунд:
зы. добавлю ссылку по теме, что б не потерять: http://bugs.freepascal.org/view.php?id=7182
Аватара пользователя
Talker1
новенький
 
Сообщения: 54
Зарегистрирован: 16.07.2013 18:45:45

Re: Модульность

Сообщение Иван Шихалев » 14.11.2013 12:47:57

А там нечего читать, собственно.
http://wiki.lazarus.freepascal.org/CMem
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Модульность

Сообщение Mirage » 14.11.2013 16:52:09

Talker1 писал(а):В дельфях под винды я уже привычно пишу DLL-модули запихивая туда формы, отчеты, логику.


Таки зачем? Какую проблему решает вынос в dll?
Какие создает понятно.
В bpl зачем выносить я понимаю, а вот в dll не понимаю.
Модульность тут не причем. Модульность это когда код по разным юнитам.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Модульность

Сообщение Talker1 » 14.11.2013 17:09:24

В нашем случае использование dll решает 2 задачи - вынос в отдельный dll-модуль совместно используемого (разными exe-шниками) функционала и второе - плагины.
Аватара пользователя
Talker1
новенький
 
Сообщения: 54
Зарегистрирован: 16.07.2013 18:45:45

Re: Модульность (DLL)

Сообщение ODIN » 14.11.2013 19:33:19

а зачем выносить в отдельный dll модуль общий функционал? может лучше общий функционал держать на уровне тока модулей, и пусть в одном ехе всё хранится, а то я обслуживал КУЧУ всяких систем, которые использовали ЕЩЁ БОЛЬШУЮ КУЧУ всяких dll и когда начиналась вакханалия в том что эти dll устаревали и шли в разнобой с друг с другом и приложениями... то все начинали прыгать скакать..
ODIN
незнакомец
 
Сообщения: 4
Зарегистрирован: 18.10.2011 22:14:33

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru