2016-09-27 84 views
1

我正在测试Delphi 2007,而我的groupproject由2个包组成。安装包时无法加载包%s的错误

enter image description here

PackageRun.bpl

它标记为 “只运行”,并包含一个名为中定义一个空TFRAME后裔 “uMyTestRun.pas” 单位:

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(组件,安装包...,添加...),我收到以下错误:

Can't load package C:\<...>\PackageDes.bpl. Impossibile trovare il modulo specificato.

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

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

RegisterComponents('MyComponents', [TMyTest]); 

有什么错在我的代码/项目/环境?

+0

运行时包是否可以通过设计时间包得到并“可找到”?这意味着它应该位于系统路径变量的目录中。这个软件包也应该可以通过IDE找到。 –

+0

定义de组件TMyTest在哪里?如何定义? –

+0

@GermánEstévez-Neftalí-我已经通过添加uMyTestRun.pas单元更新了我的问题 – ExDev

回答

6

http://SysInternals.com运行进程监视器并设置筛选器仅拦截Delphi IDE进程的文件操作(工具栏最右边的按钮)(检查TaskManager中的进程名称或快捷方式属性(它是Delphi XE2的bds.exe)),然后添加过滤器类似于包含/进程名称/结束与/ bds.exe)。

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

现在你会得到Delphi加载你的包的文件I/O活动的痕迹(和其他一些背景活动噪声 - 你做得越快,噪声就越少)。在跟踪中查找所有错误,并查看Delphi试图找到哪些软件包以及哪些软件包。

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

+1

即使我已经通过阅读评论解决了我的问题,我尝试了您的解决方案,并且我可以说它会起作用。 ProcessMonitor显示了很多操作,试图在所有系统路径变量路径中查找“PackageRun.bpl”,对于这些操作中的每一个,结果都是“NAME NOT FOUND”。我想ProcessMonitor将会在以后节省我的时间,谢谢! – ExDev

+0

这就是为什么我提到它 - 虽然你已经抓住了这个特定的鱼,但有一个钓鱼竿所有类似的未来麻烦永远不会坏:) –

-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. 

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

问候。

+3

我试图从运行时间部分中划分出设计时间。 – ExDev

0

来解决这个问题简单的方法是一个后生成操作添加到您的运行时项目:

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

上面拷贝命令的运行时文件的默认IDE栉Bpl位置。