我的主要问题是如何排除“我的BPL不会因为依赖而加载,不管我清理和重新编译了多少”。Update您可能认为您有一个干净的重新编译系统,但是由于Windows及其文件系统虚拟化错误特性的逆奇迹,您还没有。
当我试图将设计时包(在本例中名为dclFsTee.bpl
)加载到Delphi (它是快速报表4 teechart包装组件包)时,它会抱怨:
The program can't start because tee7100.bpl is missing from your computer. Try reinstalling ...
据我所知,在我的系统上的任何DCP或DCU文件上都没有引用tee7100.bpl
。但很明显,有些地方不对劲,我找不到问题所在。
所有Delphi用户都面临着BPLs的100个“不编译或不加载”问题。当被问到该怎么做时,大家都会重复一遍,那就是清理你的电脑。
然而,我现在花了几个小时来清理我的计算机,虽然所有的东西都在编译文件,但是很明显,一定有一些过时的东西隐藏在某个地方,因为我试图加载的结果BPL文件仍然希望加载我几天前从这个系统中删除的TeeChart BPL的一个版本,以及我能找到的所有跟踪。
我删除的Delphi2007中的TeeChart内容的跟踪包括$(BDS)\Lib和$(BDS)\Lib\debug文件夹中的所有内容,以及系统上的所有DCP和BPL文件夹。另外,每个TeeChart命名的dcu文件都不见了。
一旦你走到了路的尽头,你接下来会尝试什么?(格式化硬盘,购买新电脑。)我是认真的。我认为我是个聪明人,但我有一个1TB硬盘驱动器,一个可以运行到80+文件夹的库路径,以及一个看起来组织得很好的源代码存储库,但是很明显,在我找不到它的地方隐藏着一些东西。
我有TeeChart标准2012,有完整的源代码,据我所知,我的开发机器不再包含任何旧的TeeChart BPLs或DCP文件,这些文件来自德尔菲附带的"tee图表tee7100.bpl“版本。
我已经运行了teechart附带的"recompile.exe“向导,该向导似乎只运行MSBuild并构建包,然后将{$DEFINE x}声明写入tee.inc文件(源分发版中有两个)。
但是,在某种程度上,悄悄地,似乎有一个隐式导入到其中一个包中,正在绘制一些未重新构建的陈旧文件,因此试图加载tee7100.bpl。新的bpl名称是tee911.bpl。
我没有问这个非常具体的快速报告问题,我只是把它作为一个伤害世界的具体例子,在德尔菲开发过程中,我已经面对了数十次。
我只提供快速报告的细节,这样您就可以看到,这实际上是一个通用问题的具体实例,有时在Delphi中处理组件源代码、包或包集时会遇到依赖关系。清理您的计算机,以便您的代码甚至构建可能是棘手的。
下面是我的Delphi包对包依赖解决问题:
更新在与此进行了许多小时的斗争之后,使用了我所知道的每一个技巧,我意识到在Windows 7中没有文件虚拟化导致的相关问题。这意味着Windows 7对运行在其之上的程序是谎言。它给了你另一个版本的文件,这不是你想要的。这在几方面是致命的;一种是重新编译BPL,但这不是加载BPL的方式。杀死我的BPL位于SysWow64文件夹中,该文件夹是VirtualStore的一部分。请注意,虚拟商店基本上使幻影文件出现,只有当您是某个“低优先级”程序时,才会出现这些文件,而Delphi 2007在Win7 7/64位上显然是这样。要删除当前用户帐户的SysWow64 VIRTUALSTORE文件夹中的BPL文件:
del %HOMEPATH%\AppData\Local\VirtualStore\Windows\SysWow64\*.bpl
..。有时候我只是讨厌Windows架构。无论如何,我不会把上面的答案作为答案,因为我想知道是否有人有更好的方法,或任何建议或建议,可能会有帮助下次。
发布于 2016-05-03 13:37:38
造成这种情况的另一个问题是没有将.bpl文件存储在系统路径中的文件夹。
这是因为Delphi试图使用文件名而不是绝对路径调用WinAPI函数LoadLibrary。因此,如果Windows找不到文件,Delphi就无法加载它。
有关详细信息,请参阅这个论坛帖子。
这似乎是Windows 7中的一个问题,虽然在Windows 10中不是这样。
https://stackoverflow.com/questions/12161554
复制相似问题