かなり単純なラッパー.exeを作成したDelphiアプリケーションがあります。
基本的に、多数の関数を含むdllがあり、ラッパーが必要な処理を実行したら、そのうちの1つを繰り返し呼び出します。私はこのdllファイルを管理しておらず、管理することはありません。
さて、今このDLLはBPLであり、そのファイル内で関数を呼び出す方法がわかりません。前もって感謝します。
パッケージから関数を使用する簡単な方法は、関数を含むユニットを「使用」し、通常どおりに呼び出して、プロジェクトのランタイムパッケージのリストにパッケージを配置することです。それが機能するためには、いくつかの要件があります。
3番目の要件を満たせない場合、またはパッケージを常にロードしたくない場合は、LoadPackage
代わりにそれを呼び出すことができます。それを機能させる方法は、常にロードされている別のパッケージを用意することです。これは、プロジェクトとロードするパッケージの両方で使用されます。中間パッケージは、メインパッケージがアプリケーションにその関数が何であるかを伝えるために使用できるインターフェース(一部の登録関数、変数、またはクラスなど)を公開します。アプリケーションでメインパッケージのユニットを直接「使用」することはできません。
最初の2つの要件を満たせない場合は、はるかに難しい方法があります。これは、アプリケーションがDelphiまたはC++Builderで作成されていない場合にも行う必要があります。パッケージを通常のDLLのように扱います。でロードしLoadLibrary
ます。GetProcAddress
関数をロードしてInitialize
から呼び出すために使用します。(呼び出し規約はregister
ではなく、であることを忘れないでくださいstdcall
。)次に、関数の名前がいくつかのユニットとタイプの情報を含むように変更されていることに注意して、呼び出したい関数のアドレスをロードします。を呼び出すFinalize
前に関数を呼び出しますFreeLibrary
。LoadPackage
およびのソースを確認してくださいUnloadPackage
。電話をかける必要があるかどうかはCheckForDuplicateUnits
、おそらく要件番号1を満たすことができるかどうかによって異なります。
BPLは、いくつかの特定の追加が加えられた単なるDLLです。DLLを使用した場合と同じように、関数を呼び出すのに問題はありませんが、1つの特定の注意点があります。BPLは、使用しているのと同じバージョンのDelphiでビルドする必要があります。ソースコードがない場合、これは大きな欠点になる可能性があります。これが問題になる場合は、作成者と話し合い、DLLに戻すように依頼する必要があります。
BPLは多くのDLLの問題を取り除くことができます。静的にリンクできる場合、境界線はほとんど透明になります。動的にロードする必要がある場合は、1つのDLLスタイルのアクセス関数(通常はオブジェクトまたはインターフェイスを返す関数)といくつかの一般的なタイプ(インターフェイス)の定義が必要です。これらはすべて、BPLのメーカーが提供する必要があります。