目前我将一个项目从 Delphi XE 移动到 XE8。我们使用一个组件,但最新版本是针对 XE3 的,所以我获取代码并对其进行更改,直到它编译为止。现在我想安装设计时包,但我得到了缺少 rtl170.bpl 的错误。没有人提到 rtl170 只提到 rtl 库。我读了一些关于运行时包的东西,但在这个项目中,我在项目选项的包下没有这个菜单项。有什么建议吗?之前在这台计算机上安装了 Delphi XE,但我在安装 XE8 之前卸载了它。
2 回答
适用于 XE3,所以我获取代码并对其进行更改,直到它编译
通常,组件由两个 BPL 文件、一个运行时包和一个设计时包(使用运行时包)组成。组件库(如 Raize、JediVCL、DevExpress 等)由数十个 BPL 对组成。
使用一些工具来检查 DLL 依赖项(例如:CFF Explorer 或 Microsoft Dependency Walker 或 WLX FileInfo )并检查您的组件 BPL - 您必须确定组件的 BPL 中的哪一个需要rtl170.bpl
DLL
使用 SysInternals Process Monitor 之类的记录 BPL 加载或仅扫描所有磁盘以查找这些 BPL 名称可能是一个有用的想法。您可能有类似的情况:
- 您尝试安装的新建设计时 BPL(没有指向 rtl170 的链接)
- 新建的运行时 BPL(也没有到 rtl170 的链接)
- 较旧的运行时 BPL,由 XE3 构建并引用 rtl170。如果存在,则 (1) BPL 可能会找到并加载 (3) 而不是 (2),因此无论您要重新编译多少 (2),它都不会产生任何影响。
这只是一个可能的混淆场景,但它肯定会发生。确保没有 xe3 制造的 BPL 的旧残留物。
有时只是查找和删除杂散的旧 BPL 修复问题(例如 - 修复了 XE2 的 upd4 :-D )。
对于其余部分,我们认为您没有发现旧的流氓 BPL,并且您发现新的 XE8 编译的 BPL 仍然引用 rtl170。
然后,如果您有组件的完整源 - 删除(或暂时移走)其所有 DCP/DCU 文件并强制从所有包的源编译可能会有所帮助。同样,您可以使用 SysInternals Process Monitor 等工具对 Delphi 编译包的文件访问日志进行快照。有时它表明,由于不同的原因,您的德里忽略了 DPK/PAS 源文件,而是使用旧的 DCU/DCP 进行编译。
说真的,XE8 与 XE3 的 DCU/DCP 兼容的可能性很低,但这仍然是研究您的情况的途径之一。
现在我们假设您没有任何组件的 dcu/dcp/bpl 文件显式地位于 Delphi 可访问的 HDD 上。假设您采用了编译组件的唯一方法——100% 从源代码中完成。
有可能——这些设置要么在你的错误包的 .DPK 文件(或任何其他 Pascal 源)中,要么在你的错误包的 .DPROJ 文件中(然后它们可以在 IDE 项目选项对话框中或通过任何 XML 编辑器访问)。或者有时在 DPROJ 和 PAS/DPK 文件中。
您将找到这些设置并将它们从 m170 修复为 xe8 BPL 的实际后缀
我遇到了同样的问题,花了我一段时间才找到解决方案。我当前的 Delphi 版本是 XE6,但是当我尝试安装特定的 BPL 时,它一直想使用 rtl170。BPL 编译正常,但无法安装。机器上曾经有 XE3 的副本,但我已将其卸载。
原来我在 C:\Windows\sysWOw64 中有相同运行时 BPL 的旧副本。一旦我删除了 sysWOw64 中的副本,XE6 就不再抱怨了。