delphi - 解决无法加载 BPL 但您已经重新编译的 Delphi BPL 包问题(Windows VirtualStore 文件系统问题)

标签 delphi dependencies bpl

我的一般问题是如何解决“由于依赖项不会消失,无论我清理和重新编译多少次,我的 BPL 都不会加载”。 更新 您可能认为您有一个干净的重新编译系统,但由于 Windows 的逆向奇迹及其文件系统虚拟化错误功能,您没有。

当我尝试将我的设计时包(在本例中名为 dclFsTee.bpl )加载到我的 Delphi IDE(它是快速报告 4 teechart 包装器组件包)中时,它会提示:

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

那个tee7100.bpl我所知道的系统上的任何 DCP 或 DCU 文件都没有引用。但很明显,出了点问题,我找不到问题所在。

所有 Delphi 用户都面临着一百个 BPL“无法编译或无法加载”的问题。当被问及要做什么时,普遍的说法是清理您的计算机。

然而,我现在花了几个小时清理我的电脑,虽然一切都在编译文件,但显然一定有一些过时的东西隐藏在某个地方,因为我试图加载的结果 BPL 文件仍然想要加载一个版本的几天前我从这个系统中删除的 TeeChart BPL,以及我能找到的每一条痕迹。

我删除的 Delphi 2007 中 TeeChart 的痕迹包括 $(BDS)\Lib 和 $(BDS)\Lib\debug 文件夹中的所有内容,以及系统上的所有 DCP 和 BPL 文件夹。每个 TeeChart-unit-named dcu 文件也消失了。

一旦你走到了路的尽头,接下来你要尝试什么? (格式化硬盘,买新电脑。)说真的。我想我是个聪明人,但我有一个 1 TB 的硬盘驱动器,一个运行到 80 多个文件夹的库路径,以及一个似乎组织良好的源代码存储库,但显然有些东西隐藏在我无法做到的地方找到它。

我有 TeeChart Standard 2012,带有完整的源代码,据我所知,我的开发机器不再包含来自 delphi 附带的“tee chart tee7100.bpl”版本的任何旧的 TeeChart BPL 或 DCP 文件。

在向 tee.inc 文件写入 {$DEFINE x} 声明后,我已经运行了 teechart 附带的“recompile.exe”向导,它似乎只是运行 MSBuild 并构建包分布)。

然而,不知何故,似乎其中一个包的隐式导入之一正在绘制一些尚未重建的陈旧文件,因此尝试加载 tee7100.bpl。新的 bpl 名称是 tee911.bpl。

我没有问这个非常具体到 fastreport 的问题,我只是将它作为我在 Delphi 中开发时遇到过几十次的普遍伤害世界的一个具体实例。

我只提供了快速报告的详细信息,因此您可以看到这实际上是在处理具有依赖项的组件源代码或包或包集时有时在 Delphi IDE 中面临的一般问题的特定实例.清理您的计算机以便您的代码甚至可以构建可能会很棘手。

所以这是我的 Delphi 包到包依赖解析问题:
  • 查找或跟踪某些不再需要的 BPL 问题的隐式加载的最有效方法是什么,以便我的代码(构建和编译得很好!)实际加载到 Delphi IDE 中。运行重新编译产生的 BPL 文件似乎正确链接到正确的 DCP 文件,并且不存在旧的/陈旧的 DCP 或 DCU 文件。例如,新的 DCP 文件名为 tee911.dcp。
  • 你能以某种方式知道什么包实际上是陈旧的,以及当 .bpl 链接时静态读取、链接和导入的内容吗? (我在想可能像 BPL 文件的特殊 MAP 类文件?)

  • 更新 经过几个小时的斗争,并使用我知道的每一个技巧,我意识到我没有checked for some VirtualStore related issues由 Windows 7 中的文件虚拟化引起。这意味着 Windows 7 依赖于在它上面运行的程序。它为您提供了另一个版本的文件,这不是您想要的。这在很多方面都是致命的;一;您重新编译了一个 BPL,但这不是加载的那个。杀死我的 BPL 位于作为 VirtualStore 一部分的 SysWow64 文件夹中。请注意,虚拟存储基本上会使幻影文件出现,只有当您是某个“低权限”程序时才会出现幻影文件,这显然是 Win7/64 位的 Delphi 2007。要删除当前用户帐户的 SysWow64 VIRTUALSTORE 文件夹中的 BPL 文件:
       del %HOMEPATH%\AppData\Local\VirtualStore\Windows\SysWow64\*.bpl
    

    ... 有时我只是讨厌 Windows 架构。无论如何,我不会将上述内容作为答案,因为我想知道是否有人有更好的方法或任何提示或建议,下次可能会有所帮助。

    最佳答案

    好的,没有其他人回答,所以我会把它放在这里对 future 的人有帮助:

    -- 在清理损坏的系统时,请记住 Windows VirtualStore,这些系统上有旧版本的 DLL,包括 TeeChart、FastReport、Indy 等,这些系统往往会陷入困惑,因为它们可以作为“delphi 附带的开箱即用包”存在以及如果您直接从供应商处购买并安装它们,则经常作为升级版本安装,或者第三,您可能在公司的 mega-component-pack-目录中拥有自己的编译副本。

    -- 当搜索重复的或过时的 BPL 时,在 Windows 中进行文件搜索不会在虚拟存储中查找,您必须手动为您的进程或用户或程序定位并清除整个虚拟存储区域。

    这个问题的第二层是这样的:

    FastReports 的依赖图很复杂:

  • 这取决于 Indy,您可能有自己的 Indy 版本,Delphi 本身也有,而您硬盘上的其他东西可能有自己的 Indy 副本。
  • 它支持各种版本的 TeeChart,包括 Delphi 附带的二进制文件,以及您可能从 Steema 购买的 TeeChart 的标准版或其他购买版本。
  • 它使用预编译的头包含文件来进行编译,而不仅仅是同名包含 (.inc) 文件的一个而是两个不同的副本。
  • 当您使用他们自己的编译器工具(重新编译 FastReport)时,它工作得非常可靠,但当您想从单个构建脚本构建项目中的所有内容时,它并不是最好的,因此是我问题的根源。
  • 关键是要了解关于庞大软件包中所有组件的依赖关系的所有知识,并干净地组织系统,以便您没有旧的东西(如 Indy 和 TeeChart bpls、dcp 或 dcu文件)躺在周围。如果您不知道自己在做什么,那么清理它是一项相当复杂的工作。
  • 一个实用程序可以真正删除系统随附的 Indy 和 TeeChart 版本的所有痕迹,而 FastReports 的“Embarcadero 版”是解决这种情况的关键。一般提示是“如果 X 的某个版本随 Delphi 一起提供,而您要安装新版本,请准备好忍受直到您的系统真正清理干净”。
  • 避免所有这些废话的一个非常了不起的技术是在您最初的 Delphi IDE 安装期间不安装 Indy、FastReport 或 TeeChart(取消选中或跳过它们),然后从源代码中自己一个一个地安装它们。仅仅因为 Delphi 中预装了一个版本并不能使它成为一件好事。 (更新:您不能再在安装过程中取消选择 Indy,它是 Delphi 基本产品的一部分,至少从 Delphi XE8 开始。从 Delphi 自己的 lib 目录中删除内置 Indy 的清理实用程序对于任何构建自己的人来说都是必要的.)
  • 另一个真正令人惊奇的技术是在虚拟机上运行商业组件的安装程序,然后只需收集 pascal 源代码并将其传输到干净的开发机器上,然后自己构建。这样你就可以避免在你的系统中散布着 BPL 和其他东西,甚至安装到 C:\Windows\System32 中时发生的可怕事情。 (在 32 位系统上)和 C:\Windows\SysWow64 (64 位系统上的等效路径)。
  • 关于delphi - 解决无法加载 BPL 但您已经重新编译的 Delphi BPL 包问题(Windows VirtualStore 文件系统问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12161554/

    相关文章:

    Delphi 项目需要运行时包,即使运行时包已关闭

    delphi - 对象列表未检索数据

    linux - Unix - 依赖任务执行

    css - 未满足的同伴依赖

    delphi - 如何解决打开项目时 Delphi XE 中的 bpl 加载问题?

    Delphi:带有内置包的 .exe:600kb,.exe + 外部 BPL:6MB。这是为什么?

    delphi - Delphi [语言、RTL、VCL] 中新增功能的分类列表?

    mysql - 如何使用 dbExpress 处理多结果集查询

    delphi - TMultiView on Frame 导致 AV

    python - 在 Python 中使用内置库会受到惩罚吗?