我正在 Delphi 2007 上进行测试,我的小组项目由 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.
两个包的输出目录都在Library路径中(里面有bpl、dcp和dcu)。
尝试安装 PackageDes.bpl(组件、安装包...、添加...),我收到以下错误:
无法加载包 C:\<...>\PackageDes.bpl。不可能的事 模规格。
消息的最后一部分是我的操作系统语言,用英语应该是“找不到指定的模块”。 (我的操作系统是Windows 10 Pro 64位)。
PackageDes.bpl 与错误消息中显示的路径完全相同 (C:\<...>\PackageDes.bpl)。 经过一些测试,我发现通过从 uMyTestDes.pas 单元中删除以下行,错误消失了:
RegisterComponents('MyComponents', [TMyTest]);
我的代码/项目/环境有问题吗?
从 http://SysInternals.com 运行进程监视器并设置过滤器以仅拦截 Delphi IDE 进程的文件操作(工具栏最右边的按钮)(检查任务管理器或快捷方式属性中的进程名称(它是 bds.exe ) Delphi XE2),然后添加类似于 Include / Process Name / Ends With / bds.exe 的过滤器。
然后清除PM中的日志,切换到Delphi并尝试加载包,然后一旦弹出错误就切换回PM并停止捕获事件。尝试尽可能快地完成此操作,例如,不要浪费时间关闭错误框。
现在您将获得 Delphi 加载您的包的文件 I/O 活动的踪迹(以及一些其他后台活动噪音 - 您做得越快,噪音就越少)。在该跟踪中查找所有错误并查看 Delphi 尝试查找的位置和包。
您还可以尝试 Microsoft Dependency Walker 或类似工具来检查您的设计时 BPL 是否具有可解析的所有 DLL 依赖关系树。就我个人而言,我通常使用 Unreal/Total Commander 和 FileInfo 插件或 ntCore CFF Explorer。
解决此问题的简单方法是将构建后操作添加到运行时项目中:
copy "$(OUTPUTDIR)\$(OUTPUTFILENAME)" "$(BDSCOMMONDIR)\Bpl"
上面的命令将运行时文件复制到默认的 IDE Bpl 位置。
我也有类似的问题。就我而言,我在不同的 Delphi 版本 BPL 路径中具有相同的库名称。我通过查看上面的评论找到了问题的解决方案,因此这只是提醒您检查基本事项:
对我来说,问题出在 DProj 文件中。 该字段不接受下划线:
<DllSuffix>_$(Auto)</DllSuffix>
在 IDE 的项目选项中手动设置该字段不会有帮助。我必须将该字段设置为随机值(“x”),保存项目,然后再次打开“项目选项”并将该字段放回 $(Auto)。然后就成功了。
尝试将
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.
现在,软件包将正确安装。
问候。