安装软件包

时间:2016-09-27 14:00:14

标签: delphi ide package bpl

我正在测试Delphi 2007,我的groupproject由2个软件包组成。

enter image description here

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。 Impossibile trovare il   modulo specificato。

信息的最后部分是我的操作系统语言,英文版应该是"无法找到指定的模块"。 (我的操作系统是Windows 10 Pro 64位)。

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

RegisterComponents('MyComponents', [TMyTest]);

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

4 个答案:

答案 0 :(得分:8)

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尝试查找的位置和包。

如果您的Design-Time BPL具有可解析的所有DLL依赖关系树,您还可以尝试使用Microsoft Dependency Walker或类似工具。我个人通常使用Unreal / Total命令与FileInfo插件或ntCore CFF Explorer。

答案 1 :(得分:1)

我有类似的问题。在我的情况下,我在不同的Delphi版本BPL路径中具有相同的库名称。我找到了解决上述评论的问题的解决方案,所以这只是提醒我们要检查的基本内容:

  • BPL路径必须包含在您的OS路径变量中;
  • 在正确的OS路径之前搜索具有相同名称的BPL模块(多个Delphi版本安装)。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:-3)

尝试将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.

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

问候。