0

BPLプロジェクトを作成し、出力 .bpi ファイルを別の EXE プロジェクトに追加しましEXEプロジェクトは適切にコンパイルおよびリンクされます。.bplファイルを.exeファイルと同じフォルダーに置くと、EXE は正常に動作します。ただし、.bplファイルを.exeファイル以外のフォルダーに置くと、 EXEが実行されず、「XXX.bpl が見つからないため、プログラムを開始できません...」と表示されます。

DLL版も書いて、.dllファイルを.exeファイル以外のフォルダに入れました。.dllEXEプロジェクトの [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をアップグレードして、他の番号を返すようにすることもできます。したがって、最終的な結果は、カスタムBPLEXEでデプロイできるようであり、 RTLVCLなどの他のBPLは、依然としてEXEで静的にリンクされています。唯一の制限は、カスタムBPLがEXEと同じフォルダーにある必要があることです。TestPackage::GetInt()、これを克服する方法はありますか?

4

0 に答える 0