Решение проблем пакета Delphi BPL, где BPLs не загружается, но вы уже перекомпилированы (проблема файловой системы Windows VirtualStore)

мой общий вопрос: как вы устраняете неполадки "мой BPL не будет загружаться из-за зависимости, которая просто не исчезнет, независимо от того, сколько я очищаю и перекомпилирую". обновление вы можете думать, что у вас есть чистая перекомпилированная система, но благодаря обратному чуду, которое является Windows, и его виртуализации файловой системы mis-функции, вы не имеете.

когда я пытаюсь загрузить пакет designtime (в этом случае с именем dclFsTee.bpl) в мою IDE Delphi (это быстрый отчет 4 teechart wrapper component package), он жалуется:

The program can't start because tee7100.bpl is missing from your computer. Try reinstalling ...

Это tee7100.bpl не упоминается ни в одном файле DCP или DCU в моей системе, о котором я знаю. Но очевидно, что что-то не так, и я не могу найти проблему.

все пользователи Delphi сталкиваются с сотней проблем" не компилируются или не загружаются " с BPLs. Универсальный рефрен, когда его спрашивают, Что делать, - это очистить компьютер.

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

следы TeeChart в Delphi 2007, которые я удалил, включают все в папке $(BDS)Lib и $(BDS)Libdebug, а также все папки DCP и BPL в системе. Также каждый файл dcu с именем TeeChart-unit ушедший.

как только вы добрались до конца дороги, что вы пытаетесь сделать дальше? (Отформатируйте жесткий диск, купите новый компьютер.) Серьезно. Я думаю, что я умный парень, но у меня есть жесткий диск 1 ТБ, путь к библиотеке, который работает с папками 80+, и репозиторий исходного кода, который кажется хорошо организованным, но явно что-то скрывается там, где я не могу его найти.

у меня есть Teechart Standard 2012 с полным исходным кодом, и, насколько я знаю, моя машина разработки больше не содержит старых TeeChart bpls или DCP файлы из " tee chart tee7100.версия "bpl", которая поставляется с delphi.

я запустил "перекомпиляцию".exe " мастер, который поставляется с teechart, который, как представляется, просто запустить MSBuild и построить пакеты, после написания объявления {$DEFINE x} в тройник.Inc файлы (есть два из них в дистрибутиве).

однако, как-то, молча кажется, что один из неявных импорта в один из пакетов рисует в каком-то устаревшем файле, который не имеет был перестроен, и поэтому пытается загрузить tee7100.bpl. Новое имя bpl-tee911.bpl.

вместо того, чтобы задавать довольно специфичный для fastreport вопрос, я упоминаю его только как конкретный пример общего мира боли, с которым я сталкивался десятки раз во время разработки в Delphi.

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

Итак, вот мой вопрос о разрешении зависимостей пакета Delphi от пакета:

  1. каков наиболее эффективный способ найти или проследить неявную загрузку некоторых больше не нужных проблем BPL, чтобы мой код (который строит и компилирует просто отлично!) будет фактически загружаться в Delphi IDE. Файл BPL это приводит к запуску перекомпиляции, похоже, правильно связывается с правильными файлами DCP, и нет старых/устаревших файлов DCP или DCU. Новое имя файла DCP-tee911.ДЦП, например.

  2. можете ли вы каким-то образом получить представление о том, какой пакет на самом деле устаревший, и что читается и связано и импортируется статически, когда .ссылки на bpl? (Я думаю, может быть, как специальный картографический файл для файлов BPL?)

обновление после многих часы борьбы с этим, и используя каждый трюк, который я знаю, я понял, что я не проверено на наличие некоторых VirtualStore вопросы вызвано виртуализацией файлов в Windows 7. Это означает, что Windows 7 лежит к программам, которые работают поверх него. Это дает вам другую версию файла, который не тот, который вы хотите. Это может быть смертельным несколькими способами; один; вы перекомпилируете BPL, но это не тот, который загружается. BPL, который убивал меня, был в папке SysWow64, которая была частью Виртуальный магазин. Обратите внимание, что virtualstore в основном делает фантомные файлы, которые появляются только там, если вы определенная программа "low privelege", которая Delphi 2007 на Win7/64 бит, по-видимому, есть. Чтобы удалить файлы BPL в папке SysWOW64 VIRTUALSTORE для текущей учетной записи пользователя:

   del %HOMEPATH%AppDataLocalVirtualStoreWindowsSysWow64*.bpl

... Иногда я просто ненавижу архитектуру Windows. В любом случае, я не собираюсь ставить вышеизложенное в качестве ответа, потому что я хотел бы знать, есть ли у кого-нибудь лучший способ или любой совет или предложение, которые могут помочь в следующий раз.

3 ответов


ладно никто не ответил, поэтому я напишу это здесь, чтобы быть полезным для будущих людей:

-- помните Windows VirtualStore при очистке сломанных систем, которые имеют старые версии DLL на них, включая TeeChart, FastReport, Indy и так далее, которые, как правило, участвуют в беспорядках, потому что они могут существовать как "из коробки пакетов, которые поставляются с delphi", а также часто устанавливаются как обновленные версии, если вы приобрели и установили их у поставщиков напрямую, или, у вас может быть собственная скомпилированная копия в каталоге mega-component-pack-вашей компании.

-- при поиске дубликатов или устаревших BPLs, выполнение поиска файлов в windows не выглядит в virtualstores, вам придется найти и zap всю область virtualstore для вашего процесса или пользователя, или программы, вручную.

второй уровень этой проблемы таков:

график зависимостей для FastReports сложный:

  • Это зависит на Indy и у вас может быть своя версия Indy, и у Delphi есть одна, и другие вещи на вашем жестком диске могут иметь свою собственную копию Indy.

  • Он поддерживает различные версии TeeChart, включая двоичные файлы, которые поставляются с Delphi, и, возможно, стандартную версию или другую купленную версию TeeChart, которую вы могли бы купить у Steema.

  • он использует предварительно скомпилированный заголовок include file для компиляции, а не только Одна, но две разные копии с одинаковым именем включают (.inc) файл.

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

  • ключ должен узнать все, что нужно знать о зависимостях всех компонентов в вашей гигантской куче пакетов, и организуйте свою систему чисто, чтобы у вас не было старых вещей (таких как файлы Indy и TeeChart bpls, dcp или dcu). Чистка это довольно сложная работа, если вы не знаете, что вы делаете.

    • утилита, чтобы действительно удалить все следы версии Indy и TeeChart, которые поставляются с вашей системой, и" Embarcadero edition " FastReports является ключом к разрешению этой ситуации. Общий совет: "если версия X поставляется с Delphi и вы собираетесь установить новую версию, готовьтесь страдать, пока ваша система не будет действительно очищена".

    • действительно удивительный метод, чтобы избежать всего этого дерьма, - это просто не устанавливать Indy, FastReport или TeeChart (снимите их или пропустите) во время первоначальной установки Delphi IDE, а затем установите их самостоятельно, один за другим, из источников. Просто потому, что версия поставляется предварительно установленной в Delphi, не делает это хорошей вещью. (Обновление: вы больше не можете отменить выбор Indy во время установки, это часть базового продукта Delphi, по крайней мере, с Delphi XE8. Утилита очистки для удаления встроенного Indy из собственных lib dirs Delphi необходима для всех, кто строит свои собственные.)

    • еще один действительно удивительный метод-запустить установщики для коммерческих компонентов на виртуальной машине, а затем просто собрать исходный код pascal и перенести его на чистую машину разработки и построить его самостоятельно. Таким образом, вы можете избежать ужасных вещей, которые случается, когда у вас есть BPLs и вещи, разбросанные по вашей системе, и даже установленные в C:\Windows\System32 (на 32-битных системах) и C:\Windows\SysWow64 (эквивалентный путь в 64-битных системах).


положите это BPL (tee7100.bpl) под $(BDSCOMMONDIR)\Bpl

for XE: $(BDSCOMMONDIR)=  "C:\Users\Public\Documents\RAD Studio.0"
for XE5: $(BDSCOMMONDIR)=  "C:\Users\Public\Documents\RAD Studio.0"

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

Это происходит потому, что Delphi пытается вызвать функцию WinAPI LoadLibrary с именем файла, а не абсолютным путем. Поэтому, если Windows не может найти файл, Delphi не может его загрузить.

посмотреть данное сообщение на форуме для получения дополнительной информации.

Это, кажется, проблема в Windows 7, хотя и не в Windows 10.