4

我有一个 BPL 项目(带有一些基本内容)和一个 EXE 项目,它的搜索路径中包含另一个项目的输出(BPL 和 DCP)的位置。当使用“使用运行时包构建”构建 EXE 项目时,它构建得很好。但是,它需要我部署 EXE 和 BPL。到现在为止还挺好。

由于我宁愿只部署 EXE(无论它变得更大),我想我只是取消选中“使用运行时包构建”就可以了,但事实并非如此。它不会建立,并开始抱怨缺少的课程。我可以编译 EXE 项目的唯一方法是将实际 BPL 项目的 DCU 的路径添加到 EXE 项目的搜索路径中。我可以这样做,但为什么我不得不指向 DCU?Delphi 不能直接从 BPL 中获取它们吗?这不仅仅是品味问题,如果我这样做并链接到 DCU,当涉及到属于表单的 DCU 时,它会向我询问表单 DFM,迫使我也将我的源文件夹包含到 EXE项目的搜索路径,现在看起来它们正在编译,这是令人望而却步的。我可以'

我希望我已经说清楚了。

任何有关如何实现标题中所要求的帮助的帮助表示赞赏。

谢谢你。

4

3 回答 3

5

链接外部库有两种方法:静态动态

当您使用运行时包时,这是一个动态链接。实际实现在BPL文件中(实际上是一个简单的 dll),方法和类在进程启动时从文件中导入。这会减小exe大小,但需要BPL发送文件(与通常的 dll 相同)。DCU不需要文件,因为一切都已经编译和链接,链接器只需要创建导入部分。

当运行时包被禁用时,链接器必须获取所有类和方法的目标文件并将其组合到一个可执行文件中。它无法从 中提取此数据BPL,因为它已经链接了可执行文件。它必须首先取消链接,分离不同的模块实现,这基本上是不可能的。所以你必须提供DCU文件,包含编译的目标代码来链接你的程序。

因此,您的问题标题的答案很简单-不,这是不可能的。

于 2016-08-30T06:07:53.973 回答
3

不,你不能。如果要使用运行时包,则必须打开编译器选项才能使用运行时包进行构建。

至于问题的第二部分:使用运行时包构建使用 *.dcp 文件进行编译(.dfm 流链接到包的资源中,因此不需要直接使用 *.dfm 文件)。没有运行时包的构建需要 *.dcu 和 *.dfm 文件(以及任何其他必需的文件)。

无论哪种情况,您都需要在库/搜索路径中有所需的文件才能编译/构建。

于 2016-08-30T07:08:09.927 回答
0

这是可能的,但很难实施。为此,您将需要创建第三个项目 - 加载器。您需要将原始 EXE 项目转换为使用运行时 pckages 构建的 DLL。加载程序可以将您的 DLL 项目、rtl.bpl、vlc.bpl 和您的 BPL 项目作为加载程序可执行文件中的资源包含在内。Loader 将需要手动执行所有由LoadLibraryWindows API 完成的操作。

您可以阅读有关如何从内存中加载 DLL 的更多信息,并在此处找到一些代码示例。

于 2018-07-01T22:41:06.227 回答