【问题标题】:Can't load package %s error while installing a package安装包时无法加载包 %s 错误
【发布时间】:2017-02-05 04:59:16
【问题描述】:

我在 Delphi 2007 上进行测试,我的 groupproject 由 2 个包组成。

PackageRun.bpl

它被标记为“仅运行时”并包含一个名为“uMyTestRun.pas”的单元,其中定义了一个空的 TFrame 后代:

unit uMyTestRun;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs;

type
  TMyTest = class(TFrame)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.dfm}

end.

PackageDes.bpl

它需要 PackageRun.bpl,它被标记为“仅设计时”并包含一个名为“uMyTestDes.pas”的单元,我在其中编写了以下代码:

unit uMyTestDes;

interface

uses
  Classes,
  uMyTestRun;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyComponents', [TMyTest]);
end;

end.

两个包的输出目录都在库路径中(里面有bpl、dcp和dcu)。


尝试安装 PackageDes.bpl(组件、安装包...、添加...),我收到以下错误:

无法加载包 C:\<...>\PackageDes.bpl。不可能的曲子 模规格。

消息的最后一部分是我的操作系统的语言,英文应该是“找不到指定的模块”。 (我的操作系统是 Windows 10 Pro 64bit)。

PackageDes.bpl 与错误消息中显示的路径完全相同 (C:\<...>\PackageDes.bpl)。 经过一些测试,我发现通过从 uMyTestDes.pas 单元中删除以下行,错误消失了:

RegisterComponents('MyComponents', [TMyTest]);

我的代码/项目/环境有什么问题吗?

【问题讨论】:

  • 设计时包是否可以访问和“找到”运行时包?这意味着它应该位于系统路径变量的目录中。 IDE 也应该可以找到该包。
  • 组件TMyTest在哪里定义?是怎么定义的?
  • @GermánEstévez-Neftalí- 我通过添加 uMyTestRun.pas 单元更新了我的问题
  • EXE/DLL/BPL 加载是 Windows 管理的,而不是 Delphi。有关 LoadModule 功能,请参阅 MSDN。如果 Windows 找不到相关的 DLL - BPL 是 DLL 的一个特定案例 - 那么它就不能。 Windows 对 Delphi 一无所知,也无法检查是否有一些非标准的地方供 ne BPL 使用。 Windows 只知道 Windows 设置,而不知道 Delphi 设置。
  • 库路径是给IDE的,但是设计时BPL需要运行时BPL来加载,就像加载DLL一样。这就是为什么运行时 BPL 必须在路径中。

标签: delphi ide package bpl


【解决方案1】:

http://SysInternals.com 运行进程监视器并将过滤器设置为仅拦截 Delphi IDE 进程的文件操作(工具栏最右边的按钮)(检查任务管理器中的进程名称或快捷方式属性(对于 Delphi XE2 是 bds.exe),然后添加类似于 Include / Process Name / Ends With / bds.exe 的过滤器)。

然后在PM中清除日志,切换到Delphi并尝试加载包,然后一旦弹出错误就切换回PM并停止捕获事件。尽可能快地完成它,例如不要浪费时间关闭错误框。

现在您将获得 Delphi 加载您的程序包的文件 I/O 活动的踪迹(以及其他一些背景活动噪音 - 您执行得越快,噪音就越少)。在该跟踪中查找所有错误并查看 Delphi 尝试查找的位置和包。

您还可以尝试 Microsoft Dependency Walker 或类似工具来检查您的设计时 BPL 是否具有可解析的所有 DLL 依赖树。就我个人而言,我通常使用带有 FileInfo 插件或 ntCore CFF Explorer 的 Unreal/Total 指挥官。

【讨论】:

  • 即使我已经通过阅读 cmets 解决了我的问题,我也尝试了您的解决方案,我可以说它会奏效。 ProcessMonitor 显示了许多试图在所有系统路径变量路径中查找“PackageRun.bpl”的操作,对于这些操作中的每一个,结果都是“未找到名称”。我认为 ProcessMonitor 将来会在其他时间拯救我,谢谢!
  • 这正是我提到它的原因——虽然你已经钓到了这条特定的鱼,但是拥有一根钓鱼竿来应对未来所有类似的麻烦从来都不是坏事:)
  • 该死,这有帮助。在我的情况下,每次打开 D7 时它都会失败,找不到 SynEdit_D7 bpl,甚至很难从正确的路径加载它。我认为 delphi 所做的是输出带有主包名称的错误,但问题是它试图从另一个文件夹加载 SynEdit_R7,但消息吐出的是 SynEdit_D7 而不是 R7。查看监控日志,我在一些 Delphi 文件夹中看到 SynEdit_R7 的一些“未找到”,我只是复制所有文件并将它们放在该文件夹中。问题解决了。
  • @P.Waksman Delphi 对此无能为力。 Delphi 调用 Windows 来加载 DLL,Windows 也尝试加载所有需要的静态链接 DLL,整个依赖关系树。如果 Windows 无法加载需求,那么整个顶层加载也会失败,这就是 Delphi 可以看到的。您可以使用独立于 Jedi CodeLib、Visual C++ 的 Dependency Walker 工具。或用于 Total Commander 和 Unreal Commander 的 FileInfo 和 PEViewer VLX 等插件。
【解决方案2】:

解决此问题的简单方法是在运行时项目中添加构建后操作:

copy "$(OUTPUTDIR)\$(OUTPUTFILENAME)" "$(BDSCOMMONDIR)\Bpl"

上面的命令将您的运行时文件复制到默认的 IDE Bpl 位置。

【讨论】:

    【解决方案3】:

    我遇到了类似的问题。就我而言,我在不同的 Delphi 版本 BPL 路径中有相同的库名称。我通过查看上面的 cmets 找到了我的问题的解决方案,所以这只是对基本检查的提醒:

    • BPL 路径必须包含在您的操作系统路径变量中;
    • 在右侧的其他操作系统路径中搜索具有相同名称的 BPL 模块(多个 Delphi 版本安装)。

    【讨论】:

      【解决方案4】:

      尝试将register 过程更改为uMyTestRun 单位。

      unit UMyTestRun;
      
      interface
      
      uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
      
      type
        TMyTest = class(TFrame)
        private
          { Private declarations }
        public
          { Public declarations }
        end;
      
      procedure Register;
      
      implementation
      
      procedure Register;
      begin
        RegisterComponents('MyComponents', [TMyTest]);
      end;
      end.
      

      现在,包将正确安装。

      问候。

      【讨论】:

      • 我正在尝试将设计时间与运行时部分分开。
      猜你喜欢
      • 1970-01-01
      • 2012-10-04
      • 2016-04-14
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多