繁体   English   中英

是否可以单独根据BPL / DCP构建针对BPL / DCP的EXE项目,其中“Build With Runtime Packages”未经检查?

[英]Can one build an EXE project against a BPL/DCP with “Build With Runtime Packages” unchecked, based solely on the BPLs/DCPs?

我有一个BPL项目(有一些基础东西)和一个EXE项目,它在其搜索路径中有另一个项目输出的位置(BPL和DCP)。 当使用“Build With Runtime Packages”构建EXE项目时,它构建正常。 但是,它需要我部署EXE和BPL。 到现在为止还挺好。

因为我宁愿只部署EXE(无论它变大),我猜我只是取消选中“Build With Runtime Packages”并且就是这样,但事实并非如此。 它不会构建,并开始抱怨缺少的类。 我可以编译EXE项目的唯一方法是将实际BPL项目的DCU路径添加到EXE项目的搜索路径中。 我可以这样做,但为什么我被迫指向DCU? 德尔福不能把它们从BPL中拿走吗? 这不只是一个品味的问题,如果我走这条路,并链接到DCU,当涉及到属于表格的DCU时,它会询问我的表格DFM,迫使我也包括我的源文件夹到EXE项目的搜索路径,现在它们似乎正在编译,这是令人望而却步的。 每次我想编译我的EXE项目时,我都无法重新编译我的BPL项目代码库。

我希望我已经说清楚了。

如何实现标题中提出的任何帮助表示赞赏。

谢谢。

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

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

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

所以回答你的问题标题很简单 - 不可能。

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

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

在任何一种情况下,您都需要在库/搜索路径中拥有所需的文件才能进行编译/构建。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM