Получение версий BPL при запуске программы - PullRequest
2 голосов
/ 19 сентября 2008

Можно ли проверить, какая версия 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

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

Ответы [ 5 ]

2 голосов
/ 19 сентября 2008

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

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

2 голосов
/ 19 сентября 2008

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

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

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

1 голос
/ 24 сентября 2008

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

1 голос
/ 19 сентября 2008

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

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

Привет.

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

0 голосов
/ 19 сентября 2008

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

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

...