BPLプロジェクトを作成し、出力 .bpi ファイルを別の EXE プロジェクトに追加しました。EXEプロジェクトは適切にコンパイルおよびリンクされます。.bplファイルを.exeファイルと同じフォルダーに置くと、EXE は正常に動作します。ただし、.bplファイルを.exeファイル以外のフォルダーに置くと、 EXEが実行されず、「XXX.bpl が見つからないため、プログラムを開始できません...」と表示されます。
DLL版も書いて、.dllファイルを.exeファイル以外のフォルダに入れました。.dllをEXEプロジェクトの [C++ リンカ] -> [詳細設定] -> [DLL の読み込みを遅らせる] リストに追加しSetDllDirectory()
、カスタム検索パスに関数呼び出しを追加しました。EXEは問題なく動作します。.bplを介してカスタム検索パスを使用して遅延ロードした場合、 .bplは.dllと同じように動作しないようSetDllDirectory()
です。よろしいですか?
テスト 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 );
}
アプリケーション オプションで「 Build with runtime packages」と「Dynamic RTL 」の両方を無効にしました。TestPackage.bplをEXEとしてフォルダーに配置すると、EXEは正常に動作しました。EXEとは別にBPLをアップグレードして、他の番号を返すようにすることもできます。したがって、最終的な結果は、カスタムBPLをEXEでデプロイできるようであり、 RTLやVCLなどの他のBPLは、依然としてEXEで静的にリンクされています。唯一の制限は、カスタムBPLがEXEと同じフォルダーにある必要があることです。TestPackage::GetInt()
、これを克服する方法はありますか?