2008-09-19 57 views
2

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

我有一些程序崩溃,因为那里的计算机上的BPL不同于生成计算机上的BPL。
如果我必须在每次更新中添加每个使用的BPL到安装程序,我认为它会打败使用它们的一个要点。

德尔福7,如果它的确与众不同


只是在这个问题上,我不得不跟进。
构建计算机和客户端之间的rtl70.bpl文件只是略有不同。

客户端计算机:7.0.4.453 760 KB(778240个字节)周二,2002年8月20日,下午4时40分26秒
建立计算机:7.0.4.453 760 KB(778240个字节)周五,9 2002年8月,下午11点30分

我使用的更新程序忽略它们是相同的(没有更改内部版本号),但是当我手动删除并复制文件时,工作。

回答

2

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

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

+0

Thankyou,这就是我想听到的,有点......;) – 2008-09-22 00:06:03

2

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

问题是,在启动应用程序时会发生这种情况,Windows应用程序通过称为MapAndLoad(也读取this)的API执行此操作。在您的应用程序启动之前调用此API,因此我无法拦截此应用程序。

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

1

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

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

问候。

P.D:不好意思,因为我的英语不好。

-1

有时候Delphi会自动添加一行代码:
{$ R'*。res'}
到项目或包的文件。

注释(//)该行并重新编译。

1

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

+1

这应该是被接受的答案 - 因为它告诉如何在运行主可执行程序之前先检查版本 – mjn 2010-11-10 15:31:36

相关问题