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

时间:2012-08-28 14:30:13

标签: 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 ...

我知道系统上的任何DCP或DCU文件都没有引用tee7100.bpl。但显然,有些事情是错的,我找不到问题。

所有Delphi用户都面临一百个“不会编译或不会加载”BPL问题。当被问及做什么时,通用副词是清理您的计算机。

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

我删除的Delphi 2007中的TeeChart内容包括$(BDS)\ Lib和$(BDS)\ Lib \ debug文件夹中的所有内容,以及系统上的所有DCP和BPL文件夹。此外,每个以TeeChart为单位命名的dcu文件都已消失。

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

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

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

然而,不知何故,似乎默认情况下,其中一个隐式导入到其中一个软件包中的是一个尚未重建的陈旧文件,因此尝试加载tee7100.bpl。新的bpl名称是tee911.bpl。

我没有提出具体的快速报告问题,而是仅仅提到它是我在Delphi开发时遇到过几十次伤害的一般世界的特定实例。

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

所以这是我的Delphi包到包依赖解析问题:

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

  2. 你能以某种方式得到任何关于什么包实际上是陈旧的,以及当.bpl链接时正在读取和链接以及静态导入的内容吗? (我想也许像BPL文件的特殊MAP类文件?)

  3. 更新经过几个小时的战斗,并使用我知道的每一个技巧,我意识到我在Windows 7中没有checked for some VirtualStore related issues由文件虚拟化引起的。这意味着Windows 7适用于运行在其上的程序。它为您提供了该文件的另一个版本,而不是您想要的版本。这在几个方面可能是致命的;一;你重新编译了一个BPL,但那不是加载的。杀死我的BPL位于SysWow64文件夹中,该文件夹是VirtualStore的一部分。请注意,虚拟存储基本上会出现幻像文件,只有当你是一个特定的“低级别”程序时才会出现,其中Delphi 2007在Win7 / 64位上显然是这样。要删除当前用户帐户的SysWow64 VIRTUALSTORE文件夹中的BPL文件:

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

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

3 个答案:

答案 0 :(得分:11)

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

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

- 搜索重复或过时的BPL时,在Windows中进行文件搜索不会查看虚拟商店,您必须找到并删除整个虚拟商店区域,以用于您的进程或用户或程序,手动

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

FastReports的依赖关系图很复杂:

  • 这取决于Indy,你可能拥有自己的Indy版本,而Delphi本身就有一个版本,你硬盘上的其他东西可能有自己的Indy版本。

  • 它支持各种版本的TeeChart,包括Delphi附带的二进制文件,以及您可能从Steema购买的标准版或其他购买的TeeChart版本。

  • 它使用预编译的头文件包含文件进行编译,而不只是一个名称相同的include(.inc)文件的一个而是两个不同的副本。

  • 当您使用自己的编译器工具(重新编译FastReport)时,它的工作非常可靠,但是当您想要从单个构建脚本构建项目中的所有内容时,这不是最好的,因此是我的问题的根源。

  • 关键是要了解所有关于所有组件中所有组件的依赖关系的知识,并干净地组织您的系统,以便您没有旧东西(如Indy和TeeChart) bpls,dcp或dcu文件)躺在周围。如果你不知道自己在做什么,那么清理它是一项非常复杂的工作。

    • 用于真正删除系统附带的Indy和TeeChart版本的所有痕迹的实用程序,FastReports的“Embarcadero版本”是解决此问题的关键。一般提示是“如果X版本与Delphi一起发布,并且您要安装新版本,请准备好直到您的系统真正清理完毕”。

    • 避免所有这些废话的一个非常神奇的技术是在最初的Delphi IDE安装过程中不安装Indy,FastReport或TeeChart(取消选中或跳过它们),然后从源头逐个安装它们。仅仅因为在Delphi中预安装了一个版本并不是一件好事。 (更新:你不能再在安装过程中取消选择Indy,它至少是Delphi XE8的基础Delphi产品的一部分。从Delphi自己的lib目录中删除内置Indy的清理实用程序对任何自己构建的人都是必要的。 。)

    • 另一个非常神奇的技术是在虚拟机上运行商业组件的安装程序,然后收集pascal源代码并将其传输到您的清洁开发机器上,并自行构建。这样你可以避免在你的系统中散布BPL和散布物品时发生的可怕事情,甚至安装到C:\Windows\System32(在32位系统上)和C:\Windows\SysWow64(等效路径在64上)比特系统)。

答案 1 :(得分: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"

答案 2 :(得分:1)

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

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

有关详细信息,请参阅this forum post

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