Модульность (DLL)
Модератор: Модераторы
Модульность (DLL)
Привет!
Возник вопрос как организовать модульность программируя в Lazarus, так чтобы это работало и в виндах и в линуксе?
В дельфях под винды я уже привычно пишу DLL-модули запихивая туда формы, отчеты, логику. Но в линуксе DLL нет. И хочется конечно чтобы не нужно было из-за этого сопровождать 2 разных проекта - один под винды и другой под линукс...
В общем, решал кто такую задачу? Какие есть идеи?
Возник вопрос как организовать модульность программируя в Lazarus, так чтобы это работало и в виндах и в линуксе?
В дельфях под винды я уже привычно пишу DLL-модули запихивая туда формы, отчеты, логику. Но в линуксе DLL нет. И хочется конечно чтобы не нужно было из-за этого сопровождать 2 разных проекта - один под винды и другой под линукс...
В общем, решал кто такую задачу? Какие есть идеи?
Последний раз редактировалось Talker1 14.11.2013 17:12:53, всего редактировалось 1 раз.
Talker1 писал(а):пишу DLL-модули запихивая туда формы, отчеты, логику
Но зачем?
Talker1 писал(а):Но в линуксе DLL нет.
Там есть динамические библиотеки, расширение у них обычно .so. Есть модуль dylib в FPC (или dynlib). Вообще работа с динамическими бибилотеками в Windows и в линуксе практически одинаковая на 90%, только в расширении файлов разница наверное
Talker1 писал(а):Но в линуксе DLL нет.
Есть. Только расширение у них so. Программируются в лазарусе в linux точно так же, как и windows. Только собирая библиотеку в линуксе, лазарус будет генерировать расширение so, а в windows расширение dll.
Чтобы в линукс увидела программа собранную тобой библиотеку, надо указать к библиотеке путь в LD_LIBRARY_PATH, или положить библиотеку в системные каталоги /usr/lib.
Добавлено спустя 24 минуты 54 секунды:
Посмотри исходники ZenGL http://zengl.org/, если какие-то проблемы возникнут.
Как альтернатива - lpk-пакеты вместо библиотек
hinst, hovadur
Спасибо большое, я то полагал что .so и .dll технологически сильно разные вещи. А в Лазарус работа с DLL аналогична работе в Дельфях или там есть свои особенности? Вообще, есть ли где-то примеры и/или документация для Лазарус на эту тему?
Devel0
LPK - это видимо аналог работы с DPL в Дельфи?
У меня был один проект на Дельфи, где требовалась модульность и как раз использовал DPL, но в дальнейшем я всегда работал с DLL - проще.
Но, возможно, работа с LPK не вызывает особых особых проблем? Есть где-то примеры в сети?
Спасибо большое, я то полагал что .so и .dll технологически сильно разные вещи. А в Лазарус работа с DLL аналогична работе в Дельфях или там есть свои особенности? Вообще, есть ли где-то примеры и/или документация для Лазарус на эту тему?
Devel0
LPK - это видимо аналог работы с DPL в Дельфи?
У меня был один проект на Дельфи, где требовалась модульность и как раз использовал DPL, но в дальнейшем я всегда работал с DLL - проще.
Но, возможно, работа с LPK не вызывает особых особых проблем? Есть где-то примеры в сети?
LPK динамически не загружаются. Они позволяют разбить проект на логические части, но если внёс измненеие в LPK, то надо перекомпилировать проект, так как исполняемый файл в итоге получается один
Добавлено спустя 1 минуту 25 секунд:
работа с DLL в лазарусе аналогична как в Delphi. Принцип один и тот же - загружаешь бибилотеку и получаешь адреса функций, а потом можешь их вызывать. Можно брать функции LoadLibrary и GetProcAddress из модуля Windows либо из dynlibs
Добавлено спустя 1 минуту 25 секунд:
работа с DLL в лазарусе аналогична как в Delphi. Принцип один и тот же - загружаешь бибилотеку и получаешь адреса функций, а потом можешь их вызывать. Можно брать функции LoadLibrary и GetProcAddress из модуля Windows либо из dynlibs
hinst , спасибо за разьяснения. Будем ориентироваться на dll.
Добавлено спустя 18 часов 33 минуты 8 секунд:
Что-то не получается в вызывать DLL-ку.
Вот очень простой пример, который отлично работает в Дельфях (D7), но не хочет под Лазарусом.
Что я делаю неправильно?
Добавлено спустя 4 минуты 18 секунд:
Поясню - в проекте скомпилитрованном в Лазарусе, при вызове процедуры из DLL (тоже скомпиленном в Лазарусе), вылетает exception
Добавлено спустя 18 часов 33 минуты 8 секунд:
Что-то не получается в вызывать DLL-ку.
Вот очень простой пример, который отлично работает в Дельфях (D7), но не хочет под Лазарусом.
Что я делаю неправильно?
Добавлено спустя 4 минуты 18 секунд:
Поясню - в проекте скомпилитрованном в Лазарусе, при вызове процедуры из DLL (тоже скомпиленном в Лазарусе), вылетает exception
У вас нет необходимых прав для просмотра вложений в этом сообщении.
я примерно представляю, что можно сделать, чтобы заработало, но нужно будет много тупить...... а мне сейчас не очень хочется. Может быть если выдастся в ближайшем или не очень будущем куча свободного времени, попробую
В двух словах решение сводится к тому, чтобы попробовать это сделать по-другому
В двух словах решение сводится к тому, чтобы попробовать это сделать по-другому
Я сейчас тут поэкспериментировал с самыми разными варианами, не вылетает только если функция или процедура из DLL делает свою работу молча - без каких-то визуальных форм, сообщений и проч.
(
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
http://freepascal.ru/article/freepascal/20050522025034/
А самый простой способ — использовать везде модуль cmem. Но есть и другая проблема — дублирование корня классов. В принципе, это решается вынесением в библиотеку RTL посредством ppumove...
А самый простой способ — использовать везде модуль cmem. Но есть и другая проблема — дублирование корня классов. В принципе, это решается вынесением в библиотеку RTL посредством ppumove...
Разобрался почему мой пример не работает - в процедуре показа формы из DLL нужно было дописать Application.Initialize;
Пол-дня убил на эту ерунду..
Иван Шихалев а где-то можно прочитать про этот cmem ?
Добавлено спустя 47 минут 38 секунд:
зы. добавлю ссылку по теме, что б не потерять: http://bugs.freepascal.org/view.php?id=7182
Пол-дня убил на эту ерунду..
Иван Шихалев а где-то можно прочитать про этот cmem ?
Добавлено спустя 47 минут 38 секунд:
зы. добавлю ссылку по теме, что б не потерять: http://bugs.freepascal.org/view.php?id=7182
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
А там нечего читать, собственно.
http://wiki.lazarus.freepascal.org/CMem
http://wiki.lazarus.freepascal.org/CMem
-
Mirage
- энтузиаст
- Сообщения: 881
- Зарегистрирован: 06.05.2005 20:29:07
- Откуда: Russia
- Контактная информация:
Talker1 писал(а):В дельфях под винды я уже привычно пишу DLL-модули запихивая туда формы, отчеты, логику.
Таки зачем? Какую проблему решает вынос в dll?
Какие создает понятно.
В bpl зачем выносить я понимаю, а вот в dll не понимаю.
Модульность тут не причем. Модульность это когда код по разным юнитам.
В нашем случае использование dll решает 2 задачи - вынос в отдельный dll-модуль совместно используемого (разными exe-шниками) функционала и второе - плагины.
а зачем выносить в отдельный dll модуль общий функционал? может лучше общий функционал держать на уровне тока модулей, и пусть в одном ехе всё хранится, а то я обслуживал КУЧУ всяких систем, которые использовали ЕЩЁ БОЛЬШУЮ КУЧУ всяких dll и когда начиналась вакханалия в том что эти dll устаревали и шли в разнобой с друг с другом и приложениями... то все начинали прыгать скакать..
