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

我遇到过一些程序崩溃的情况,因为计算机上的 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 字节)‎2002 年 8 月 ‎9 号星期五,‏‎11:30:00 PM

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

有帮助吗?

解决方案

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

Neftalí 的解决方案可能是一种选择 - 当然,代价是打包 RTL、复制大量文件,并失去一开始就拥有软件包的一个要点。但是,如果您使用私有 DLL(即,如果您将 DLL 复制到私有二进制文件目录中),那么您还应该创建一个与可执行文件同名的空文件,但附加扩展名 。当地的 到它,即为了 记事本程序 你会创建一个 记事本.exe本地. 。看 Raymond Chen 关于 DLL 重定向的文章 更多细节。

其他提示

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

问题是,这种情况发生在应用程序启动时,Windows 操作系统通过一个名为 映射和加载 (另请阅读 )。这个 API 是在你的应用程序启动之前调用的,所以我看不出有什么方法可以拦截它。

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

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

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

问候。

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

您无法通过使用这些 bpls 的可执行文件来执行此操作,但您可以使用一个小型启动程序来检查 bpls,然后调用主可执行文件。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top