12

我的一般问题是如何解决“我的 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 命名的 dcu 文件也都消失了。

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

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

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

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

我没有提出关于fastreport 的非常具体的问题,我只是将它作为我在Delphi 开发时遇到过数十次的一般伤害世界的一个具体实例来提及。

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

所以这是我的 Delphi package-to-package-dependency-resolution 问题:

  1. 查找或跟踪一些不再需要的 BPL 问题的隐式加载的最有效方法是什么,以便我的代码(构建和编译得很好!)实际上将加载到 Delphi IDE 中。运行 Recompile 生成的 BPL 文件似乎正确链接到正确的 DCP 文件,并且不存在旧的/陈旧的 DCP 或 DCU 文件。例如,新的 DCP 文件名为 tee911.dcp。

  2. 您能否以某种方式了解哪些包实际上是陈旧的,以及 .bpl 链接时正在读取、链接和静态导入的内容?(我在想可能像 BPL 文件的特殊类似 MAP 的文件?)

更新经过数小时的斗争,并使用了我所知道的每一个技巧,我意识到我没有检查 Windows 7 中文件虚拟化引起的一些VirtualStore相关问题。这意味着 Windows 7 依赖于在它之上运行的程序. 它为您提供了文件的另一个版本,这不是您想要的。这在几个方面可能是致命的;一; 您重新编译了一个 BPL,但它不是加载的。杀死我的 BPL 位于 VirtualStore 的 SysWow64 文件夹中。请注意,虚拟存储基本上会使幻像文件出现,只有当您是某个“低权限”程序时才会出现,这显然是 Win7/64 位上的 Delphi 2007。要删除当前用户帐户的 SysWow64 VIRTUALSTORE 文件夹中的 BPL 文件:

   del %HOMEPATH%\AppData\Local\VirtualStore\Windows\SysWow64\*.bpl

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

4

3 回答 3

12

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

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

-- 在搜索重复或过时的 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 位系统上的等效路径)时发生的可怕事情。

于 2013-01-22T16:45:17.527 回答
3

将该 BPL (tee7100.bpl) 放在 $(BDSCOMMONDIR)\Bpl 下

for XE: $(BDSCOMMONDIR)=  "C:\Users\Public\Documents\RAD Studio\8.0"
for XE5: $(BDSCOMMONDIR)=  "C:\Users\Public\Documents\RAD Studio\12.0"
于 2013-10-04T02:02:01.707 回答
1

可能导致此问题的另一个问题是系统路径中没有存储 .bpl 文件的文件夹。

这是因为 Delphi 尝试使用文件名而不是绝对路径调用 WinAPI 函数 LoadLibrary。因此,如果 Windows 找不到该文件,Delphi 就无法加载它。

有关更多信息,请参阅此论坛帖子

这似乎是 Windows 7 中的一个问题,但在 Windows 10 中不是。

于 2016-05-03T13:37:38.140 回答