【发布时间】:2017-02-05 04:59:16
【问题描述】:
我在 Delphi 2007 上进行测试,我的 groupproject 由 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.
两个包的输出目录都在库路径中(里面有bpl、dcp和dcu)。
尝试安装 PackageDes.bpl(组件、安装包...、添加...),我收到以下错误:
无法加载包 C:\<...>\PackageDes.bpl。不可能的曲子 模规格。
消息的最后一部分是我的操作系统的语言,英文应该是“找不到指定的模块”。 (我的操作系统是 Windows 10 Pro 64bit)。
PackageDes.bpl 与错误消息中显示的路径完全相同 (C:\<...>\PackageDes.bpl)。 经过一些测试,我发现通过从 uMyTestDes.pas 单元中删除以下行,错误消失了:
RegisterComponents('MyComponents', [TMyTest]);
我的代码/项目/环境有什么问题吗?
【问题讨论】:
-
设计时包是否可以访问和“找到”运行时包?这意味着它应该位于系统路径变量的目录中。 IDE 也应该可以找到该包。
-
组件TMyTest在哪里定义?是怎么定义的?
-
@GermánEstévez-Neftalí- 我通过添加 uMyTestRun.pas 单元更新了我的问题
-
EXE/DLL/BPL 加载是 Windows 管理的,而不是 Delphi。有关 LoadModule 功能,请参阅 MSDN。如果 Windows 找不到相关的 DLL - BPL 是 DLL 的一个特定案例 - 那么它就不能。 Windows 对 Delphi 一无所知,也无法检查是否有一些非标准的地方供 ne BPL 使用。 Windows 只知道 Windows 设置,而不知道 Delphi 设置。
-
库路径是给IDE的,但是设计时BPL需要运行时BPL来加载,就像加载DLL一样。这就是为什么运行时 BPL 必须在路径中。