Delphi 无法安装设计时软件包:缺少@Classes@TStream@从vcl50.bpl写入$qqrpxvi 短版 我的设计时软件包无法安装 因为我的运行时包库是bpl 需要导出@Classes@TStream@从vcl50.bpl 这是不存在的 长版本

Delphi 无法安装设计时软件包:缺少@Classes@TStream@从vcl50.bpl写入$qqrpxvi 短版 我的设计时软件包无法安装 因为我的运行时包库是bpl 需要导出@Classes@TStream@从vcl50.bpl 这是不存在的 长版本,delphi,delphi-5,Delphi,Delphi 5,尝试安装设计时软件包时,Delphi 5会收到一个加载程序错误: 程序入口点@Classes@TStream@在动态链接库c:\program files(x86)\borland\delphi5\Projects\Bpl\AvataDateTimePickerd5.Bpl中找不到Write$qqrpxvi 清除加载程序显示的错误对话框后,Delphi将显示相同错误的自己版本: 所以我查了一下档案 我使用dependens检查dll中的导出: c:\program files (x86)\b

尝试安装设计时软件包时,Delphi 5会收到一个加载程序错误:

程序入口点@Classes@TStream@在动态链接库c:\program files(x86)\borland\delphi5\Projects\Bpl\AvataDateTimePickerd5.Bpl中找不到Write$qqrpxvi

清除加载程序显示的错误对话框后,Delphi将显示相同错误的自己版本:

所以我查了一下档案 我使用dependens检查dll中的导出:

c:\program files (x86)\borland\delphi5\Projects\Bpl\AvatarDateTimePickerD5.bpl
果然,没有导出名为:

@Classes@TStream@Write@qqrpxvi
@Classes@TStream@Write@qqrpxvi
事实上,根本没有以@Classes开头的导出:

确保它加载的是正确的 因此,我使用进程监视器来确保它正在读取正确的文件。它是:

因此,请检查运行时构建 你会记得通常有两个包:

  • contosogroberd5:运行时
  • contosogroberd5d:设计时间
在这种情况下,加载的是设计时包,它依赖于运行时包:

AvataDateTimePickerD5.bpl

因此,我将加载先前生成的运行时包以观察它的构建,并且它在构建时不会发生意外:

并将其写入预期位置。它执行所有的文件写入操作:

它成功地、正确地并且非常有意地没有生成名为:

@Classes@TStream@Write@qqrpxvi
@Classes@TStream@Write@qqrpxvi
但相应的设计时包声称它需要这样的导入

他说不太清楚 如果我运行取决于设计时间bpl,我会看到失败的链:

  • avataTimePickerd5d.bpl(设计时dll)
    • AvataDateTimePickerd5.bpl(运行时dll)
    • vcl50.bpl
      • 缺少导出
        @Classes@TStream@阅读$qqrpvi
      • 缺少导出
        @Classes@TStream@写入$qqrpxvi

显然是vcl50.bpl
缺少导出

检查vcl50.bpl是否导出@Classes@TStream@写 因此,我监视安装设计时软件包的操作,经过一番搜索后,它在路径中找到它:

在“
System32
”文件夹中:

C:\Windows\SysWOW64\vcl50.bpl

所以我检查了
vcl50.bpl
的导出。没错,没有导出
@Classes@TStream@写入$\uuuuuuuuuuuuuuuuuuuuuuu

它看起来像一个文件:

创建时间:2000年1月24日凌晨4:01 SHA-1
29398F5CD966335EB38377962B12780DDEA9DBDC


发生了什么事?

@MartynA只是名称混乱。当链接器找到不匹配的.DCU文件而不是正确的文件时,有时会发生这种情况。通常通过搜索.dcu的所有实例并重命名或删除它们,然后进行生成来解决这个问题。在这种情况下,我将首先搜索您的驱动器,查找与您的两个软件包相关的所有.dcu(来自您自己源文件的任何内容)——不仅是您知道的文件夹,还有您的整个驱动器。UltraSearch(我最喜欢的新工具)能够快速查找所有142个版本的
dcu
(它直接扫描NTFS数据库)并删除它们。矛盾的是,我可以构建仅运行时软件包,但如果尝试安装仅运行时软件包(而不是错误地说这是仅运行时软件包且无法安装)
TStream.Read()
TStream.Write()
是抽象方法,它们在
TStream
本身中没有实现,因此它们没有BPL导出是有意义的。不应该尝试直接导入这些方法。因此,您的运行时包在这方面有缺陷。至于它为什么这样做,我不知道。您的
avataDateTimePickerd5.BPL
运行时包(实际上是任何包)应该在其
requires
子句中包含rtl.dcp。(这就是导出
单元的地方。)@MartynA这只是名称管理当链接器找到不匹配的.DCU文件而不是正确的文件时,有时会发生这种情况。通常可以通过搜索.DCU的所有实例并重命名或删除它们,然后进行生成来解决。在这种情况下,我首先在驱动器中搜索与这两个实例相关的所有.DCU您的软件包(来自您自己源文件的任何内容)-不仅是您知道的文件夹,还有您的整个驱动器。UltraSearch(我最喜欢的新工具)能够快速查找所有142个版本的
dcu
(它直接扫描NTFS数据库),并删除它们。矛盾的是,我可以构建仅运行时的包,但如果尝试安装仅运行时的包(而不是错误地说这是仅运行时的包,无法安装)
TStream.Read()
TStream.Write()
是抽象方法,它们在
TStream
本身中没有实现,因此它们没有BPL导出是有意义的。不应该尝试直接导入这些方法。因此,您的运行时包在这方面有缺陷。至于它为什么这样做,我不知道。您的
avataDateTimePickerd5.BPL
运行时包(实际上是任何包)应该在其
requires
子句中包含rtl.dcp(这就是导出
单元的地方)。