2

是否可以在程序启动时检查客户端计算机上安装了哪个版本的 BPL(即 Rtl70.BPL、Indy70.bpl 等)?

我有一些程序崩溃,因为那里计算机上的 BPL 与构建机器上的不同。
如果我必须在每次更新时将每个 BPL 添加到安装程序中,我认为它会破坏使用它们的要点之一。

Delphi 7,如果它有所作为


只是跟进我遇到的问题。
构建计算机和客户端之间的 rtl70.bpl 文件仅略有不同。

客户端计算机:7.0.4.453 760 KB(778,240 字节),2002 年 8 月 20 日,星期二,下午 4:40:26
构建计算机:7.0.4.453 760 KB(778,240 字节)‎周五,‎9 ‎2002 年 ‎8 月‎,‏‎11:晚上 30:00

我使用的更新程序忽略了它们是相同的(内部版本号没有变化),但是当我手动删除并复制文件时,一切似乎都有效。

4

5 回答 5

2

如果您的程序崩溃,可能是因为它无法加载与其动态链接的库。(正如您所说,当系统在搜索路径中的任何位置都找不到所需库的副本时,就会发生这种情况)。

问题是,这发生在应用程序启动时,Windows 操作系统通过称为MapAndLoad的 API 执行此操作(另请阅读内容)。这个 API 在你的应用程序启动之前就被调用了,所以我看不出有什么办法可以拦截它。

我可以给出的一个建议是使用启动器(必须静态链接,以防止在根本没有 /no/ 库时出现问题)。这个启动器可以检查你的实际应用程序,查看它需要什么导入,检查你的环境并向用户显示一个很好的失败/故障排除建议对话框。

于 2008-09-19T06:45:17.323 回答
2

很不幸的是,不行。如果崩溃是由于缺少应用程序所需的 .bpl 文件的导入,则无法(除了重写 Delphi RTL 和链接器本身)从崩溃的可执行文件本身中检查这些包。PatrickvL 的解决方案可能最适合您的情况。

Neftalí 的解决方案可能是一种选择——当然,代价是打包 RTL、复制大量文件以及失去最初拥有包的一个要点。但是,如果您使用私有 DLL(即,如果您将 DLL 复制到私有二进制目录中),那么您还应该创建一个与可执行文件同名但将扩展名.local附加到它的空文件,即记事本.exe你会创建一个notepad.exe.local。有关详细信息,请参阅Raymond Chen 关于 DLL 重定向的文章

于 2008-09-19T19:21:04.190 回答
1

是否可以在程序启动时检查客户端计算机上安装了哪个版本的 BPL(即 Rtl70.BPL、Indy70.bpl 等)?我有一些程序崩溃,因为那里的计算机上的 BPL 与构建机器上的不同。如果我必须在每次更新时将使用的每个 BPL 添加到安装程序中,我认为它会破坏 > 使用它们的一个要点。

您必须将 BPL(RTL70.bpl、INDY.BPL、...)的副本(开发)安装到安装应用程序的同一目录中。您的应用程序首先搜索同一目录中的 BPL,然后搜索路径内的目录。不利的一点是您的系统可以拥有相同 BPL 的多个副本,而有利的一点是您不会遇到同一文件的不同版本的问题。

问候。

PD:对不起,我的英语不好。

于 2008-09-19T08:37:41.763 回答
1

您不能从使用这些 bpls 的可执行文件中执行此操作,但您可以有一个小型启动程序来检查 bpls,然后调用主可执行文件。

于 2008-09-24T06:13:03.697 回答
-1

有时 Delphi 会在项目或包的文件中 添加自动形式的行:
{$R'*.res'} 。

注释 (//) 该行并再次编译。

于 2008-09-19T08:42:26.527 回答