Получение версий BPL при запуске программы

StackOverflow https://stackoverflow.com/questions/99057

  •  01-07-2019
  •  | 
  •  

Вопрос

Можно ли проверить, какая версия BPL (т. е. Rtl70.BPL, Indy70.bpl и т. д.) установлена ​​на клиентском компьютере при запуске программы?

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

Delphi 7, если это имеет значение


Просто продолжение проблемы, которая у меня возникла.
Файл rtl70.bpl лишь немного отличался на компьютере сборки и на клиентах.

Клиентский компьютер:7.0.4.453 760 КБ (778 240 байт) Вторник, 20 августа 2002 г., 16:40:26
Сборка компьютера:7.0.4.453 760 КБ (778 240 байт) ‎Пятница, 9 августа 2002 г., 23:30:00

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

Это было полезно?

Решение

К сожалению нет.Если сбой произошел из-за отсутствия импорта из файлов .bpl, необходимых вашему приложению, нет способа (если не считать переписывания RTL Delphi и самого компоновщика) проверить наличие этих пакетов изнутри самого аварийного исполняемого файла.Решение ПатриквЛ, вероятно, лучше всего подойдет для вашей ситуации.

Решение Нефтали может быть вариантом - конечно, за счет упаковки RTL, дублирования большого количества файлов и потери одного из пунктов наличия пакетов в первую очередь.Однако, если вы используете частные библиотеки DLL (т. е. если вы копируете библиотеки DLL в свой личный каталог двоичных файлов), вам также следует создать пустой файл с тем же именем, что и ваш исполняемый файл, но с добавлением расширения. .местный к этому, т.е.для блокнот.exe ты бы создал notepad.exe.local.Видеть Статья Раймонда Чена о перенаправлении DLL Больше подробностей.

Другие советы

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

Проблема в том, что это происходит при запуске приложения, что ОС Windows делает через API, называемый КартаИЗагрузка (также читайте этот).Этот API вызывается еще до запуска вашего приложения, поэтому я не вижу способа его перехватить.

Одно из предложений, которое я мог бы дать, — это использовать программу запуска (которая должна быть статически связана, чтобы предотвратить проблемы, когда библиотеки /no/ вообще отсутствуют).Этот модуль запуска может проверять ваше фактическое приложение, видеть, что ему нужно для импорта, проверять вашу среду и отображать пользователю удобный диалог с предложениями по устранению сбоев / неполадок.

Можно ли проверить, какая версия BPL (т. е. Rtl70.BPL, Indy70.bpl и т. д.) установлена ​​на клиентском компьютере при запуске программы?У меня случались сбои в некоторых программах, потому что BPL на этом компьютере отличался от тех, что были на машине сборки.Если мне придется добавлять каждый используемый BPL в установщик при каждом обновлении, я думаю, это нарушит один из пунктов их использования.

Вы должны установить свою копию (разработать) BPL (RTL70.bpl, INDY.BPL,...) в тот же каталог, в котором вы устанавливаете приложение.Ваше приложение сначала ищет BPL в том же каталоге, а затем выполняет поиск в каталогах внутри пути.Отрицательным моментом является то, что в вашей системе может быть несколько копий одного и того же BPL, положительным моментом является то, что у вас не возникнет проблем с разными версиями одного и того же файла.

С уважением.

П.Д.:Извините за мой плохой английский.

Вы не можете сделать это из исполняемого файла, который использует эти bpls, но вы можете иметь небольшую программу запуска, которая проверяет bpls, а затем вызывает основной исполняемый файл.

Иногда Delphi добавляет автоматическую форму строки:
{$R ' *.res'}
в файлы проекта или пакетов.

Закомментируйте (//) эту строку и повторите компиляцию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top