Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在程序启动时获取BPL版本_Delphi_Delphi 7_Bpl - Fatal编程技术网

Delphi 在程序启动时获取BPL版本

Delphi 在程序启动时获取BPL版本,delphi,delphi-7,bpl,Delphi,Delphi 7,Bpl,当程序启动时,是否可以检查客户端计算机上安装了什么版本的BPL(即Rtl70.BPL、Indy70.BPL等) 我有一些程序崩溃,因为那里计算机上的BPL与构建计算机上的BPL不同。 如果我必须在每次更新时将使用的每个BPL添加到安装程序中,我认为这将违反使用它们的要点之一 Delphi 7,如果有区别的话 只是对我遇到的问题进行了跟进。 rtl70.bpl文件在构建计算机和客户端之间只是略有不同 客户端计算机:7.0.4.453 760 KB(778240字节)2002年8月20日星期二下午

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

我有一些程序崩溃,因为那里计算机上的BPL与构建计算机上的BPL不同。
如果我必须在每次更新时将使用的每个BPL添加到安装程序中,我认为这将违反使用它们的要点之一

Delphi 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, ‏‎晚上11:30:00


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

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

问题是,这种情况发生在应用程序启动时,Windows操作系统通过一个名为(也称为read)的API执行此操作。这个API甚至在应用程序启动之前就被调用了,所以我认为没有办法截获它

我可以给出的一个建议是使用启动器(它必须是静态链接的,以防止在完全没有/库的情况下出现问题)。 这个启动器可以检查您的实际应用程序,查看它需要什么导入,检查您的环境,并向用户显示一个漂亮的故障/疑难解答建议对话框

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

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

问候


请原谅我的英语不好。

有时德尔福会自动添加一行:
{$R'*.res'}
到项目或包的文件


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

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


Neftalí的解决方案可能是一种选择——当然,代价是打包RTL,复制大量文件,并失去首先拥有包的一个要点。但是,如果您使用的是私有DLL(即,如果您将DLL复制到私有二进制文件目录中),那么您还应该创建一个与可执行文件同名但附加扩展名.local的空文件,即对于notepad.exe,您应该创建一个notepad.exe.local。有关更多详细信息,请参阅。

您不能从使用这些BPL的可执行文件执行此操作,但您可以使用一个小型启动程序来检查BPL,然后调用主可执行文件。

谢谢,这是我想听到的,有点……)这应该是公认的答案——因为它告诉我们如何在运行主可执行文件之前先检查版本