我的主要问题是如何排除“我的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架构。无论如何,我不会把上面的答案作为答案,因为我想知道是否有人有更好的方法,或任何建议或建议,可能会有帮助下次。
发布于 2013-01-22 16:45:17
好的,没有人回答,所以我会把这个放在这里,以帮助未来的人们:
--请记住,当清理损坏的系统时,这些系统上有旧版本的DLL,包括TeeChart、FastReport、Indy等,这些系统往往涉及到混乱,因为它们既可以作为“随delphi提供的开箱即用的软件包”存在,也可以作为升级版本经常安装,如果您直接从供应商购买和安装它们,或者第三,您可以在公司的大型组件-包目录中有自己的编译副本。
--当搜索复制或过时的BPLs时,在windows中执行文件搜索并不会在虚拟商店中查找,您将不得不为您的进程或用户或程序找到并删除整个虚拟存储区域。
这个问题的第二个层次是:
FastReports的依赖关系图很复杂:
- A utility to really remove all traces of the version of Indy and TeeChart that ship with your system, and the "Embarcadero edition" of FastReports is key to getting this situation resolved. A general tip is that "if a version of X ships with Delphi and you are going to install a new version, prepare to suffer until your system is really cleaned up".
- A really amazing technique to avoid all this crap is to just not install Indy, FastReport or TeeChart (uncheck them or skip them) during your initial Delphi IDE install, then install them yourself, one by one, from sources. Just because a version comes pre-installed in Delphi doesn't make that a good thing. (Update: You can no longer unselect Indy during install, it's part of the base Delphi product since at least Delphi XE8. A clean-up utility to remove the built-in Indy from Delphi's own lib dirs is necessary for anyone who builds their own.)
- Another really amazing technique is to run the Installers for commercial components on a virtual machine, then just collect up the pascal source code and transfer that onto your clean development machine, and build it yourself. That way you can avoid the terrible things that happen when you've got BPLs and stuff scattered around your system, and even installed into `C:\Windows\System32` (on 32 bit systems) and `C:\Windows\SysWow64` (the equivalent path on 64 bit systems).
发布于 2013-10-04 02:02:01
将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"发布于 2016-05-03 13:37:38
造成这种情况的另一个问题是没有将.bpl文件存储在系统路径中的文件夹。
这是因为Delphi试图使用文件名而不是绝对路径调用WinAPI函数LoadLibrary。因此,如果Windows找不到文件,Delphi就无法加载它。
有关详细信息,请参阅这个论坛帖子。
这似乎是Windows 7中的一个问题,虽然在Windows 10中不是这样。
https://stackoverflow.com/questions/12161554
复制相似问题