我写了 BPL 项目,并将输出 .bpi 文件添加到另一个 EXE 项目中。 EXE 项目可以很好地编译和链接。如果我将 .bpl 文件放在与 .exe 文件相同的文件夹中, EXE 运行良好。但是,如果我将 .bpl 文件放在 .exe 文件以外的其他文件夹中,则 EXE 无法运行,并显示“该程序可以” t开始,因为缺少XXX.bpl ...“。
我还编写了 DLL 版本,并将 .dll 文件放在 .exe 文件以外的其他文件夹中。我将 .dll 添加到 EXE 项目的“C ++链接器” - >“高级” - >“延迟加载DLL”列表中,并添加了SetDllDirectory()
函数调用我的自定义搜索路径。 EXE 运行良好。如果通过SetDllDirectory()
延迟加载自定义搜索路径, .bpl 似乎无法与 .dll 相同,我是对的吗?
测试BPL代码如下:
“的 TestPackage.h ”
class PACKAGE TestPackage
{
TestPackage( void );
int GetInt( void );
};
“的 TestPackage.cpp ”
#include "TestPackage.h"
#pragma package(smart_init)
TestPackage::TestPackage( void ){}
int TestPackage::GetInt( void ){ return 1000; }
测试表单应用程序代码如下:
“的 TestApp.cpp ”
#include "TestPackage.h"
void __fastcall TForm1::Button1Click( TObject* Sender )
{
TestPackage* package = new TestPackage;
int ret = package->GetInt();
Application->MessageBoxA( IntToStr(ret).c_str(), L"test", 0 );
}
我在应用程序选项中禁用了“使用运行时包构建”和“动态RTL ”。我将 TestPackage.bpl 作为 EXE 放在文件夹中, EXE 效果很好。我可以将 BPL 与 EXE 分开升级,比如让TestPackage::GetInt()
返回其他数字。因此最终结果似乎我可以使用 EXE 和其他 BPL 部署我的自定义 BPL ,例如 RTL 和 VCL 仍然在 EXE 中静态链接。唯一的限制是我的自定义 BPL 必须与 EXE 位于同一文件夹中,有什么办法可以解决这个问题吗?