Getting BPL Versions at program startup程序启动时,是否可以检查客户端计算机上安装了哪个版本的BPL(即Rtl70.BPL,Indy70.bpl等)?
我有一些程序崩溃,因为该计算机上的BPL与构建计算机上的BPL不同。 Delphi 7,如果有所作为 只是跟进我的问题。
我使用的更新程序忽略了它们,因为它们是相同的(内部版本号没有更改),但是当我手动删除并复制文件时,所有事情似乎都可以正常工作。 很不幸的是,不行。如果崩溃是由于您的应用程序所需的.bpl文件缺少导入而导致的,则无法(仅重写Delphi RTL和链接器本身)无法从崩溃的可执行文件本身中检查这些软件包。 PatrickvL的解决方案可能是最适合您的情况的解决方案。 Neftalí的解决方案可能是一个选择-当然,这是以打包RTL,复制大量文件为代价,并且失去了首先拥有软件包的要点之一。但是,如果使用私有DLL(即,如果将DLL复制到私有二进制文件目录中),则还应创建一个与可执行文件同名的空文件,但在文件后附加扩展名.local,例如记事本。 .exe,您将创建一个notepad.exe.local。有关更多详细信息,请参见Raymond Chen的DLL重定向文章。 如果程序崩溃,则可能是因为它无法加载与其动态链接的库。 (正如您所说,当系统无法在搜索路径中的任何位置找到所需的库的副本时,就会发生这种情况)。 问题是,这是在应用程序启动时发生的,Windows操作系统通过称为MapAndLoad的API来执行此操作(也请阅读此内容)。甚至在您的应用程序启动之前就调用了此API,因此我看不到拦截它的方法。
我可以提出的一个建议是使用启动器(必须静态链接,以防止根本没有/ no /库的问题)。 您不能从使用这些bpl的可执行文件中执行此操作,但是可以有一个小的启动程序来检查bpl,然后调用主可执行文件。
您必须将BPL的副本(RTL70.bpl,INDY.BPL等)安装(开发)到安装应用程序的同一目录中。您的应用程序首先在同一目录中搜索BPL,然后在路径内的目录中搜索。 问候。 P.D:对不起,我的英语不好。
有时Delphi会自动添加行: 注释(//)该行,然后再次编译。 |