我编写了一个BPL项目并将输出.bpi文件添加到另一个EXE项目。EXE项目编译和链接良好。如果我将.bpl文件与.exe文件放在同一文件夹中,则EXE运行良好。但是,如果我将.bpl文件放在.exe文件以外的其他文件夹中,则EXE无法运行,并显示“程序无法启动,因为缺少 XXX.bpl...”。
我还编写了一个DLL版本并将.dll文件放在.exe文件以外的其他文件夹中。我将.dll添加到EXE项目的“C++ 链接器”->“高级”->“延迟加载 DLL”列表,并将SetDllDirectory()
函数调用添加到我的自定义搜索路径。EXE运行良好。如果通过自定义搜索路径延迟加载, .bpl似乎无法与.dllSetDllDirectory()
一样工作,对吗?
测试 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位于同一文件夹中,有什么办法可以克服吗?