0

我编写了一个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,如RTLVCL,仍然在EXE中静态链接。唯一的限制是我的自定义BPL必须与EXE位于同一文件夹中,有什么办法可以克服吗?

4

0 回答 0