在程序启动时获取BPL版本

时间:2008-09-19 02:47:47

标签: delphi delphi-7 bpl

是否有可能在程序启动时检查客户端计算机上安装的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

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

5 个答案:

答案 0 :(得分:2)

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

问题是,这是在应用程序启动时发生的,Windows操作系统通过名为MapAndLoad的API执行此操作(也请阅读this)。在您的应用程序启动之前调用此API,因此我认为无法拦截此。

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

答案 1 :(得分:2)

不幸的是,没有。如果崩溃是由于缺少来自应用程序所需的.bpl文件的导入,则没有办法(没有重写Delphi RTL和链接器本身)来检查崩溃的可执行文件本身内的那些包。 PatrickvL的解决方案可能是您的最佳选择。

Neftal的解决方案可能是一种选择 - 当然,代价是打包RTL,复制大量文件,并且首先丢失了包装中的一个要点。但是,如果您正在使用私有DLL(即,如果您将DLL复制到私有二进制文件目录中),那么您还应该创建一个与可执行文件同名的空文件,但附加扩展名 .local 对它,即对于 notepad.exe ,你要创建一个 notepad.exe.local 。有关详细信息,请参阅Raymond Chen's article on DLL redirection

答案 2 :(得分:1)

  

当程序启动时,是否可以在客户端计算机上检查安装了什么版本的BPL(即Rtl70.BPL,Indy70.bpl等)?   我有一些程序崩溃,因为那里的计算机上的BPL与构建机器上的&gt;不同。   如果我必须在每次更新时添加安装程序中使用的每个BPL,我认为它将失败&gt;使用它们之一。

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

问候。

P.D:请原谅我的英语不好。

答案 3 :(得分:1)

你不能从使用这些bpls的可执行文件中做到这一点,但你可以有一个小的启动程序来检查bpls然后调用主可执行文件。

答案 4 :(得分:-1)

有时Delphi会自动添加以下内容:
{$ R'* .res'}
到项目或包的文件。

评论(//)该行并再次编译。