首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决Delphi包问题,其中BPLs不会加载,但您已经重新编译(Windows文件系统问题)

解决Delphi包问题,其中BPLs不会加载,但您已经重新编译(Windows文件系统问题)
EN

Stack Overflow用户
提问于 2012-08-28 14:30:13
回答 3查看 33.6K关注 0票数 12

我的主要问题是如何排除“我的BPL不会因为依赖而加载,不管我清理和重新编译了多少”。Update您可能认为您有一个干净的重新编译系统,但是由于Windows及其文件系统虚拟化错误特性的逆奇迹,您还没有。

当我试图将设计时包(在本例中名为dclFsTee.bpl)加载到Delphi (它是快速报表4 teechart包装组件包)时,它会抱怨:

代码语言:javascript
复制
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包对包依赖解决问题:

  1. 什么是找到或跟踪隐式加载一些不需要更长时间的BPL问题的最有效方法,以便我的代码(它构建和编译得很好!)将实际加载到Delphi。运行重新编译产生的BPL文件似乎正确地链接到正确的DCP文件,并且没有旧/陈旧DCP或DCU文件存在。例如,新的DCP文件名为tee911.dcp。
  2. 您是否知道什么包实际上是过时的,以及在.bpl链接时是静态地读取、链接和导入什么?(我在想,也许是一个特殊的像地图一样的BPL文件?)

更新在与此进行了许多小时的斗争之后,使用了我所知道的每一个技巧,我意识到在Windows 7中没有文件虚拟化导致的相关问题。这意味着Windows 7对运行在其之上的程序是谎言。它给了你另一个版本的文件,这不是你想要的。这在几方面是致命的;一种是重新编译BPL,但这不是加载BPL的方式。杀死我的BPL位于SysWow64文件夹中,该文件夹是VirtualStore的一部分。请注意,虚拟商店基本上使幻影文件出现,只有当您是某个“低优先级”程序时,才会出现这些文件,而Delphi 2007在Win7 7/64位上显然是这样。要删除当前用户帐户的SysWow64 VIRTUALSTORE文件夹中的BPL文件:

代码语言:javascript
复制
   del %HOMEPATH%\AppData\Local\VirtualStore\Windows\SysWow64\*.bpl

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-22 16:45:17

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

--请记住,当清理损坏的系统时,这些系统上有旧版本的DLL,包括TeeChart、FastReport、Indy等,这些系统往往涉及到混乱,因为它们既可以作为“随delphi提供的开箱即用的软件包”存在,也可以作为升级版本经常安装,如果您直接从供应商购买和安装它们,或者第三,您可以在公司的大型组件-包目录中有自己的编译副本。

--当搜索复制或过时的BPLs时,在windows中执行文件搜索并不会在虚拟商店中查找,您将不得不为您的进程或用户或程序找到并删除整个虚拟存储区域。

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

FastReports的依赖关系图很复杂:

  • 这取决于Indy,您可能有自己版本的Indy,而Delphi本身也有一个,而硬盘上的其他东西可能有自己的Indy副本。
  • 它支持各种版本的TeeChart,包括Delphi附带的二进制文件,以及您可能从Steema购买的标准版本或其他购买的TeeChart版本。
  • 它使用预编译的头包含文件来进行编译,而不仅仅是使用同名包含(.inc)文件的一个副本,而是两个不同的副本。
  • 当您使用他们自己的编译器工具(重新编译FastReport)时,它的工作非常可靠,但是当您想要从单个构建脚本构建项目中的所有内容时,这并不是最好的方法,这就是我的问题的根源。
  • 关键是要了解所有这些组件的依赖关系,并清楚地组织您的系统,这样您就不会有旧的东西(比如Indy和TeeChart bpls、dcp或dcu文件)。如果你不知道你在做什么,清理它是一项相当复杂的工作。
代码语言:javascript
复制
- 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).

票数 12
EN

Stack Overflow用户

发布于 2013-10-04 02:02:01

将BPL (tee7100.bpl)置于$(BDSCOMMONDIR)\Bpl之下

代码语言:javascript
复制
for XE: $(BDSCOMMONDIR)=  "C:\Users\Public\Documents\RAD Studio\8.0"
for XE5: $(BDSCOMMONDIR)=  "C:\Users\Public\Documents\RAD Studio\12.0"
票数 3
EN

Stack Overflow用户

发布于 2016-05-03 13:37:38

造成这种情况的另一个问题是没有将.bpl文件存储在系统路径中的文件夹。

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

有关详细信息,请参阅这个论坛帖子

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12161554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档