Delphi формы в DLL

Это хорошая идея, чтобы поместить формы, которые имеют полную функциональность в DLL. И главное приложение вызовет функцию dll, которая возвращает объект формы.

5 ответов

Решение

Принятый способ сделать это в Delphi - использовать пакеты, а не библиотеки DLL.

Пакеты - это, по сути, библиотеки DLL, но с особыми возможностями Delphi, которые позволяют использовать объекты VCL через границы пакетов.

Попытка сделать это с помощью DLL приведет к множеству проблем, с которыми сталкиваются пакеты. Недостатком пакетов является то, что все модули должны быть скомпилированы с одной и той же версией Delphi. Но если вы хотите обмениваться объектами через границы модуля, вы столкнетесь с тем же ограничением, если будете использовать библиотеки DLL.

Документация Delphi имеет широкий охват пакетов.

Сказав все это, я бы добавил, что если вы можете поместить весь свой код в один модуль (.exe или.dll), то это сделает жизнь намного проще.

Добавление к ответам об использовании пакетов:

  • Пакеты могут использоваться, только если основное приложение и все библиотеки (плагины) написаны на Delphi и написаны с использованием одной и той же версии Delphi.
  • Библиотеки DLL могут быть написаны на любом языке программирования, который может их создавать, и может использоваться любой программой независимо от языка программирования.

Таким образом, использование dlls вместо пакетов имеет смысл.

Относительно самого вопроса: да, в dll можно помещать формы, и они обычно работают нормально. Просто убедитесь, что вы не передаете их, потому что они являются только действительными объектами в контексте библиотеки DLL. Вы будете испытывать странные проблемы с формами, потерявшими фокус или отстающими от других форм. Обычно это можно исправить, передав дескриптор окна из основного исполняемого файла в dll, который затем используется как родительский для формы.

Также обратите внимание: TObject вашего dll отличается от TObject вашего приложения. То же самое относится и к другим часто используемым классам и переменным, таким как (Forms.)Application.

Я сделал это, и это была боль в пояснице, но это было не невозможно. Основная программа была написана на Visual Basic 6, некоторые модули были написаны на Delphi 6, другие написаны на Delphi 7 и Delphi 2007.

Вывод: если вы уверены, что никогда не будете использовать что-то отличное от Delphi для своего приложения и для ваших dll (плагинов) и готовы всегда перекомпилировать все, когда вы переключаете версии Delphi, вам следует использовать пакеты. В противном случае может быть лучше использовать обычные библиотеки DLL. (И вы уверены, что всегда будете единственным человеком, пишущим эти dll? Может быть, когда-нибудь будет сторонний разработчик для одного из dll, которому не принадлежит нужная ему версия Delphi.)

IMO, иногда это очень хорошая идея и единственный путь - по причинам, упомянутым другими, я не фанат пакетов, и я очень доволен DLL. В настоящее время я добавляю функциональность в приложение, написанное на Delphi 5 с использованием Delphi XE - оно либо использовало DLL, либо записывалось на D5 - конечно, я выбрал первое: приложение D5 вызывает DLL, написанные на XE, которые содержат все самые последние и лучшие функции. (Первые проекты, которые я делал в Delphi, были выполнены с помощью старого Borland Paradox - приложение Paradox вызывало DLL, написанные на Delphi 1!)

Но я не отправляю форму или модуль из DLL обратно в основное приложение - я просто отправляю модулю DLL структуру, содержащую то, что ему нужно знать для выполнения своей работы, и когда это будет сделано и форма DLL закрывается, она очищает, а затем и возвращает числовой код или структуру обратно вызывающей стороне, указывая на успех, неудачу и т. д. (старомодно, но очень эффективно).

Передача экземпляра формы из DLL обратно в основное приложение через пороговое значение DLL может быть проблематичной - обратите внимание на превосходный ответ @dummzeuch выше с некоторыми полезными советами о том, как решить некоторые из этих проблем, если вы решите, что это ваше единственное решение.

+1 за все, что говорит Дэвид Хеффернан.

Стратегически, вам действительно нужно реализовать формы (или другую функциональность) только во внешних файлах, если вы внедряете подключаемую систему.

Если вы собираетесь разрешить создание плагинов на любом языке, то DLL - единственный путь.

Если ваша система плагинов будет доступна только разработчикам с той же версией Delphi (возможно, той же командой?), То используйте BPL. Дополнительным недостатком пакетов Delphi, с моей точки зрения, является необходимость развертывания VCL BPL с вашим приложением, которое всегда больше Мб, чем один скомпилированный модуль.

Если, с другой стороны, вы хотите написать модульную систему, вы все равно можете сделать это, внедрив в свой код методы слабой связи и "плагина" и по-прежнему компилировать в один модуль.

Если вы поместите форму в обычную dll, форма не сможет перехватить TAB или клавиши со стрелками. Мне сказали, что это связано с тем, что OnKeyDown не будет пропущен.

Другие вопросы по тегам