在程序启动时获取BPL版本
程序启动时,是否可以检查客户端计算机上安装了哪个版本的BPL(即Rtl70.BPL,Indy70.bpl等)?
我有一些程序崩溃,因为该计算机上的BPL与构建计算机上的BPL不同。
如果我必须在每次更新时将使用的每个BPL添加到安装程序中,我认为它会破坏使用它们的要点之一。
Delphi 7,如果有所作为
只是跟进我的问题。
rtl70.bpl文件在生成计算机和客户端之间仅稍有不同。
Clients Computer: 7.0.4.453 760 KB (778,240 bytes) Tuesday, 20 August 2002, 4:40:26 PM Build computer: 7.0.4.453 760 KB (778,240 bytes) ?Friday, ?9 ?August ?2002, ??11:30:00 PM
我使用的更新程序忽略了它们,因为它们是相同的(内部版本号没有更改),但是当我手动删除并复制文件时,似乎一切正常。
解决方案
如果程序崩溃,则可能是因为它无法加载与其动态链接的库。 (正如我们所说的,当系统无法在搜索路径中的任何位置找到所需的库的副本时,就会发生这种情况)。
问题在于,这是在应用程序启动时发生的,Windows操作系统通过称为MapAndLoad的API来执行此操作(也请阅读此内容)。甚至在应用程序启动之前就调用了此API,因此我看不到任何拦截方法。
我可以提出的一个建议是使用启动器(必须静态链接,以防止根本没有/ no /库的问题)。
该启动器可以检查实际应用程序,查看需要导入什么,检查环境并向用户显示一个不错的故障/疑难解答建议对话框。
Is it possible to check what version of BPL (ie Rtl70.BPL, Indy70.bpl etc) are installed >on a clients computer when the program starts? I have had some programs crash because the BPL on there computer is different to the ones >on the build machine. If i have to add each BPL used into the installer on each update, i think it will defeat >one of the points on using them.
我们必须将BPL的副本(RTL70.bpl,INDY.BPL等)安装(开发)到与安装应用程序相同的目录中。应用程序首先在同一目录中搜索BPL,然后在路径内的目录中搜索。
不利的是,系统将可以具有相同BPL的多个副本,有利的是,我们不会对同一文件的不同版本产生问题。
问候。
P.D:对不起,我的英语不好。
有时Delphi添加自动行:
{$ R'* .res'}
到项目或者软件包的文件。
注释(//)该行,然后再次进行编译。
抱歉不行。如果崩溃是由于应用程序所需的.bpl文件缺少导入而导致的,则无法(除非重写Delphi RTL和链接器本身)从崩溃的可执行文件本身中检查这些软件包。 PatrickvL的解决方案可能是最适合情况的解决方案。
Neftal的解决方案当然是一个选择,但要以打包RTL,复制大量文件为代价,并且失去了首先拥有软件包的要点之一。但是,如果使用私有DLL(即,如果将DLL复制到私有二进制文件目录中),则还应该创建一个与可执行文件同名的空文件,但在文件后添加扩展名.local,例如记事本。 .exe,我们将创建一个notepad.exe.local。有关更多详细信息,请参见Raymond Chen的DLL重定向文章。
我们不能从使用这些bpls的可执行文件中执行此操作,但是可以有一个小的启动程序来检查bpls,然后调用主可执行文件。