安装包时无法加载包 %s 错误
Can't load package %s error while installing a package
我在 Delphi 2007 上进行测试,我的组项目由 2 个包组成。
PackageRun.bpl
它被标记为 "runtime only" 并包含一个名为 "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,它被标记为 "designtime only" 并包含一个名为 "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.
消息的最后部分是我OS的语言,英文应该是"Can't find specified module"。 (我的 OS 是 Windows 10 Pro 64bit)。
PackageDes.bpl 与错误消息中显示的路径完全相同 (C:\<...>\PackageDes.bpl)。
经过一些测试,我发现通过从 uMyTestDes.pas 单元中删除以下行,错误消失了:
RegisterComponents('MyComponents', [TMyTest]);
我的code/projects/environment有什么问题吗?
尝试将 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.
现在,包将正确安装。
此致。
运行 来自 http://SysInternals.com 的进程监视器并设置过滤器以仅拦截 Delphi IDE 进程的文件操作(工具栏最右边的按钮)(检查进程名称在 TaskManager 或快捷方式属性中(它是 bds.exe for Delphi XE2),然后添加类似于 Include / Process Name / Ends With / bds.exe[=20= 的过滤器]).
然后清除PM中的日志,切换到Delphi并尝试加载包,然后一旦弹出错误就切换回PM并停止捕获事件。尽可能快地完成它,例如不要浪费时间关闭错误框。
现在你会得到 Delphi 文件 I/O activity 的踪迹加载你的包(和一些其他背景 activity 噪音 - 你做的越快噪音越小)。在该跟踪中查找所有错误并查看 Delphi 尝试查找的位置和包。
您也可以尝试使用 Microsoft Dependency Walker 或类似工具来确定您的设计时 BPL 是否具有所有可解析的 DLL 依赖树。我个人通常使用 Unreal/Total commander with FileInfo 插件或 ntCore CFF Explorer。
解决此问题的简单方法是向您的 运行 时间项目添加 post 构建操作:
copy "$(OUTPUTDIR)$(OUTPUTFILENAME)" "$(BDSCOMMONDIR)\Bpl"
上面的命令将您的 运行 时间文件复制到默认的 IDE Bpl 位置。
我遇到了类似的问题。在我的例子中,我在不同的 Delphi 版本 BPL 路径中有相同的库名称。我在上面的评论中找到了解决我的问题的方法,所以这只是提醒您检查基本事项:
- BPL 路径必须包含在您的 OS 路径变量中;
- 在正确的 OS 路径之前的其他 OS 路径中搜索具有相同名称的 BPL 模块(多个 Delphi 版本安装)。
我在 Delphi 2007 上进行测试,我的组项目由 2 个包组成。
PackageRun.bpl
它被标记为 "runtime only" 并包含一个名为 "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,它被标记为 "designtime only" 并包含一个名为 "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.
消息的最后部分是我OS的语言,英文应该是"Can't find specified module"。 (我的 OS 是 Windows 10 Pro 64bit)。
PackageDes.bpl 与错误消息中显示的路径完全相同 (C:\<...>\PackageDes.bpl)。 经过一些测试,我发现通过从 uMyTestDes.pas 单元中删除以下行,错误消失了:
RegisterComponents('MyComponents', [TMyTest]);
我的code/projects/environment有什么问题吗?
尝试将 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.
现在,包将正确安装。
此致。
运行 来自 http://SysInternals.com 的进程监视器并设置过滤器以仅拦截 Delphi IDE 进程的文件操作(工具栏最右边的按钮)(检查进程名称在 TaskManager 或快捷方式属性中(它是 bds.exe for Delphi XE2),然后添加类似于 Include / Process Name / Ends With / bds.exe[=20= 的过滤器]).
然后清除PM中的日志,切换到Delphi并尝试加载包,然后一旦弹出错误就切换回PM并停止捕获事件。尽可能快地完成它,例如不要浪费时间关闭错误框。
现在你会得到 Delphi 文件 I/O activity 的踪迹加载你的包(和一些其他背景 activity 噪音 - 你做的越快噪音越小)。在该跟踪中查找所有错误并查看 Delphi 尝试查找的位置和包。
您也可以尝试使用 Microsoft Dependency Walker 或类似工具来确定您的设计时 BPL 是否具有所有可解析的 DLL 依赖树。我个人通常使用 Unreal/Total commander with FileInfo 插件或 ntCore CFF Explorer。
解决此问题的简单方法是向您的 运行 时间项目添加 post 构建操作:
copy "$(OUTPUTDIR)$(OUTPUTFILENAME)" "$(BDSCOMMONDIR)\Bpl"
上面的命令将您的 运行 时间文件复制到默认的 IDE Bpl 位置。
我遇到了类似的问题。在我的例子中,我在不同的 Delphi 版本 BPL 路径中有相同的库名称。我在上面的评论中找到了解决我的问题的方法,所以这只是提醒您检查基本事项:
- BPL 路径必须包含在您的 OS 路径变量中;
- 在正确的 OS 路径之前的其他 OS 路径中搜索具有相同名称的 BPL 模块(多个 Delphi 版本安装)。