Приложение преобразовано в BPL, и теперь приложение умирает раньше, чем Application.Initialize

У меня есть приложение VCL Forms, которое включает ссылку на созданный мной файл BPL. Я добавил имя модуля компонента фрейма из BPL в раздел uses главного окна приложения VCL. Приложение создается нормально, но когда я его запускаю, оно умирает, не дойдя до первой строки «Application.Initialize» в файле проекта. Если я закомментирую единицу фрейма из предложения uses, приложение запускается и работает нормально.

Что могло вызвать фатальную ошибку при запуске приложения?

Я предполагаю, что возникла проблема с загрузкой файла BPL при запуске, но мне не удается найти ее. Спасибо.

Подробнее ниже ... Приложение VCL находится в XE5, и я пытаюсь преобразовать его в BPL. Все приложение находится в одном элементе управления TFrame, в котором находится множество других кнопок и фреймов, которые предоставляют доступ ко всем базовым функциям приложения. Этот «главный фрейм» затем помещается в основную форму приложения, которая пуста, за исключением нескольких пунктов меню. Исходное приложение работает нормально.

Я создал новый проект BPL и добавил этот компонент «основной фрейм», пытаясь создать пакет BPL, который, по сути, был всем моим приложением, и который можно было бы использовать для обычного автономного exe-приложения, как раньше, или добавить в модуль плагина RemObjects Hydra и, в конечном итоге, быть встроенным в приложение C #. Проект BPL с единственным компонентом "основной фрейм" строится нормально, без ошибок.

Затем я создал новое приложение VCL Forms с единственной пустой основной формой и установил для проекта «Параметры-> Пакеты-> Пакеты времени выполнения», чтобы включить мой новый BPL, и установил флажок «Связать с пакетами времени выполнения» вариант. Я добавил модуль "основного фрейма" в раздел uses основной формы, и все строится без ошибок.

Проблема: когда я запускаю приложение из XE5, кажется, что оно запускается как обычно, но умирает, не дойдя до самой первой строки кода «Application.Initialize;» в файле проекта. Обратите внимание, что я еще не написал никакого кода для создания экземпляра «основного фрейма», размещенного в BPL. Я только добавил его модуль в раздел uses. Сообщения об ошибках не отображаются, и ничего не отправляется в окна сборки или вывода в XE5. Если я закомментирую модуль «основного фрейма» из предложения uses, приложение будет работать нормально и будет показано пустое главное окно.

Примечание. Приложение использует JVcl, NativeXml, TsiLang, ZipForge и FastReports.


person jspence    schedule 27.03.2014    source источник
comment
Ага. Похоже, что bpl не может быть найден. Как вы думаете, почему его нужно найти?   -  person David Heffernan    schedule 27.03.2014
comment
Файлы BPL должны быть доступны по системному пути или в папке приложения. Вы должны убедиться, что файл BPL находится в одном из этих двух мест.   -  person Graymatter    schedule 27.03.2014
comment
@Graymatter Технически их поиск выполняется с использованием порядка поиска DLL: msdn. microsoft.com/en-us/library/windows/desktop/ms682586.aspx   -  person David Heffernan    schedule 27.03.2014


Ответы (1)


Симптомы, которые вы описываете, связаны с неудачным разрешением зависимости от времени загрузки. Из того, что вы описали, это вполне может быть связано с тем, что ваш файл BPL не находится во время загрузки. Зависимости пакетов во время загрузки обрабатываются системным загрузчиком, поэтому применяется порядок поиска DLL. Обычно необходимо убедиться, что зависимые модули находятся в том же каталоге, что и исполняемый файл.

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

И последнее замечание по поводу совета Embarcadero по развертыванию пакетов. Официальная документация Embarcadero по-прежнему рекомендует устанавливать общие пакеты в системный каталог. Хотя это было обычной практикой 20 лет назад под Windows 3.1, никто не должен этого делать в 21 st веке. Пожалуйста, не следуйте этому конкретному совету Embarcadero и уважайте тот факт, что системный каталог принадлежит системе.

person David Heffernan    schedule 27.03.2014