4

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

在此处输入图像描述

包运行.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。不可能的 trovare il modulo specificato。

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

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

RegisterComponents('MyComponents', [TMyTest]);

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

4

4 回答 4

13

从http://SysInternals.com运行 Process Monitor并将过滤器设置为仅拦截 Delphi IDE 进程的文件操作(工具栏最右边的按钮)(检查 TaskManager 中的进程名称或快捷方式属性(它是 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 指挥官。

于 2016-09-27T14:51:53.420 回答
1

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

  • BPL 路径必须包含在您的操作系统路径变量中;
  • 在右侧的其他 OS 路径中搜索具有相同名称的 BPL 模块(多个 Delphi 版本安装)。
于 2018-06-08T07:53:19.093 回答
1

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

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

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

于 2017-02-24T22:44:14.453 回答
-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.

现在,该软件包将正确安装。

问候。

于 2016-09-27T14:35:27.447 回答