Как развернуть ТОЛЬКО.EXE и пользовательские.BPL файлы?
Я хотел бы разработать приложение с графическим интерфейсом с плагинами. Плагины содержат формы VCL, которые унаследованы от базовых форм библиотеки Plugin-Core. Основное приложение может выбрать, какой плагин загружать динамически, а затем какие подклассы Form отображать.
Что касается пользователей, я бы хотел развернуть основной .EXE, библиотеку Plugin-Core и множество библиотек плагинов для разных моделей. Я мог бы выпускать новые или изменять существующие библиотеки плагинов для пользователей, чтобы отображать новые формы для новых устройств, не изменяя основной .EXE и библиотеку Plugin-Core.
Первая версия, которую я разработал, использует подход DLL, а именно библиотека Plugin-Core и плагины находятся в форме DLL. Все просто хорошо на стороне пользователей. Однако на стороне разработчиков проект подключаемого модуля DLL нельзя связать без базовых форм, определенных в проекте подключаемого модуля DLL. Это означает, что базовые формы на самом деле статически связаны в каждом проекте DLL плагина, и если когда-нибудь я изменю базовые формы и перестрою проект DLL плагина-ядра, мне придется перестроить все проекты DLL плагина и повторно выпустить плагины .DLL для пользователи тоже.
После поиска и запроса в Stackru, я понял, что ограничение, по которому формы VCL НЕ могут наследоваться через границы DLL, связано с конфликтом RTTI (?). Предлагаемое решение состоит в том, чтобы изменить библиотеки из DLL в форму BPL, что является второй разработанной мной версией. Все тоже хорошо, кроме следующих двух:
Динамически загружаемая форма из плагина BPL отделена от основного .EXE в панели задач Windows. Это не то, что я хотел. Решение состоит в том, что я включил "Построить с помощью пакетов времени выполнения" в проекте .EXE.
После того, как я включил "Построить с помощью пакетов времени выполнения" в проекте .EXE, я должен выпустить другие.BPL для пользователей, такие как vcl.bpl и rtl.bpl. Это не совсем то, что я хотел.
Хотелось бы знать, что вышеуказанные два вопроса могут быть решены одновременно? В моей мысли, я мог бы решить обе эти проблемы, если бы я:
- Отключите "Сборка с помощью пакетов времени выполнения" в .EXE проекте.
- Включите "Построить с помощью пакетов времени выполнения" во всех проектах .BPL.
Таким образом, .EXE может работать без vcl.bpl и rtl.bpl, а подключаемый модуль .BPL может быть успешно загружен, поскольку зависимые модули уже являются частью основного .EXE? Я прав? Однако флажок "Сборка с помощью пакетов времени выполнения" отключен во всех параметрах проекта .BPL. В результате у меня нет возможности проверить, работает ли решение или нет. Прошу прощения за длинное описание, и я не могу прикрепить изображение из-за политики интернет-безопасности компании.
1 ответ
Динамически загружаемая форма из плагина BPL отделена от основного.EXE в панели задач Windows. Это не то, что я хотел. Решение состоит в том, что я включил "Построить с помощью пакетов времени выполнения" в проекте.EXE.
После загрузки BPL, передайте EXE Application.Handle
к BPL и назначить его на собственный BPL Application.Handle
прежде чем он создает какие-либо экземпляры формы.
Кроме того, в Windows 7+, вы можете иметь вызов EXE SetCurrentProcessExplicitAppUserModelID()
установить идентификатор приложения для кнопки панели задач. Тогда каждая форма в BPLs может использовать SHGetPropertyStoreForWindow()
а также IPropertyStore.SetValue(PKEY_AppUserModel_ID)
установить одинаковый идентификатор приложения для своих окон. Несколько окон с одинаковым идентификатором приложения сгруппированы под одной кнопкой на панели задач.
См. MSDN для получения более подробной информации: идентификаторы модели пользователя приложения (AppUserModelIDs)
Хотелось бы знать, что вышеуказанные два вопроса могут быть решены одновременно? В моей мысли, я мог бы решить обе эти проблемы, если бы я:
Отключите "Сборка с помощью пакетов времени выполнения" в.EXE проекте.
Включите "Построить с помощью пакетов времени выполнения" во всех проектах.BPL.
Таким образом,.EXE может работать без vcl.bpl и rtl.bpl, а подключаемый модуль.BPL может быть успешно загружен, поскольку зависимые модули уже являются частью основного.EXE? Я прав?
Нет. BPL не могут использовать такие встроенные модули EXE.
Если вы отключите "Build with Runtime Packages", модули RTL/VCL будут статически связаны в исполняемый файл. Проблема заключается в том, что несколько копий данного модуля не могут быть загружены в память одновременно, поэтому вы не сможете загрузить несколько BPL вместе (или даже вообще), если одни и те же блоки RTL/VCL статически связаны в несколько BPL, или даже сам EXE.
Если вы включите "Построить с помощью пакетов времени выполнения", исполняемый файл будет зависеть от BPL RTL/VCL, которые затем должны быть развернуты.
Таким образом, если ваши EXE и BPL совместно используют общие блоки, эти блоки должны быть загружены через общие BPL, чтобы в памяти существовала только одна копия блоков. Этого нельзя избежать при написании пользовательских BPL. Это означает, что, как минимум, вам обычно нужно развернуть RTL.BPL, если вы используете основные функции RTL, и VCL.BPL для пользовательских интерфейсов.