【问题标题】:Getting BPL Versions at program startup在程序启动时获取 BPL 版本
【发布时间】:2010-09-11 01:46:39
【问题描述】:

是否可以在程序启动时检查客户端计算机上安装了哪个版本的 BPL(即 Rtl70.BPL、Indy70.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

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

【问题讨论】:

    标签: delphi delphi-7 bpl


    【解决方案1】:

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

    Neftalí 的解决方案可能是一种选择——当然,代价是打包 RTL、复制大量文件以及失去最初拥有包的一个要点。但是,如果您使用的是私有 DLL(即,如果您将 DLL 复制到私有二进制目录中),那么您还应该创建一个与可执行文件同名但附加扩展名 .local的空文件> 到它,即对于 notepad.exe,您将创建一个 notepad.exe.local。详情请见Raymond Chen's article on DLL redirection

    【讨论】:

    • 谢谢你,这就是我想听到的,有点……;)
    【解决方案2】:

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

    问题是,这发生在应用程序启动时,Windows 操作系统通过名为 MapAndLoad 的 API 执行此操作(另请阅读 this)。这个 API 在你的应用程序启动之前就被调用了,所以我没有办法拦截它。

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

    【讨论】:

      【解决方案3】:

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

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

      问候。

      P.D:对不起,我的英语不好。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这应该是公认的答案 - 因为它告诉如何在运行主可执行文件之前先检查版本
        【解决方案5】:

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

        注释 (//) 该行并再次编译。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-19
          • 1970-01-01
          • 1970-01-01
          • 2022-01-15
          • 2010-10-11
          • 1970-01-01
          • 1970-01-01
          • 2019-03-23
          相关资源
          最近更新 更多