1

これは一般的な問題だと思いますが、ぐるぐる回って解決策を提示していません。ライブラリの読み込みに問題があります。

私がライブラリ用に持っているソースは静的ロードを利用していますが、これは問題ありません。私が使用している残りのライブラリは動的にロードされます。

問題は、私のプログラムが別のアプリケーション(ホスト)によってライブラリ(プラグイン)としてロードされていることです。これは、HOST実行可能ファイルのディレクトリが、私のアプリケーションのプログラムディレクトリではないことを意味します。

静的にロードされているライブラリ(フォントレンダリング用の単純なライブラリ)は、プログラムのディレクトリ内にあり、ソフトウェアをプラグインとしてロードするときに見つかりません。ソフトウェアを「スタンドアロン」プログラム(ホストなし)としてロードする場合、問題はありません。

'missing'ライブラリをホストアプリケーションのフォルダに入れることで問題を解決できましたが、これは悪い解決策です。

ライブラリの名前への直接パスを提供することでも解決できましたが、これも悪い解決策です。エンドユーザーが私のソフトウェアをどこにインストールするのかわかりません。

動的ローディングを使用するようにコードを書き直すことなく、この問題を回避する方法はありますか?

静的ロードを引き続き使用するには、ライブラリを登録する必要がありますか?他のプログラムが別のバージョンのライブラリを使用している可能性があるため、このライブラリの登録は侵襲的すぎると思います。

const
  ft_lib = 'freetype6.dll';  //here is our problem. I could put a direct path
                             //here, to fix it, but I will not know this path
                             //on an end-user's machine

type
  FT_Library = Pointer;

function  FT_Init_FreeType(out alibrary : FT_Library ) : FT_Error;
  cdecl; external ft_lib name 'FT_Init_FreeType';
4

2 に答える 2

5

プログラムローダーは、システムパスでDLLを探します。freetype6.dll(およびそれが必要とするDLL)がホストexeと同じディレクトリにあるか、ファイルパス(PATH環境変数)にあるディレクトリにあることを確認してください。

参考: http: //msdn.microsoft.com/en-us/library/7d83bc18 (v = vs.71).aspx

于 2013-03-06T06:56:28.960 に答える
3

PATHの変更は非常に侵襲的な解決策であることをお勧めします。それを避けることをお勧めします。SetDllDirectoryを使用してそれを行うことができる場合があります。これにより、検索パスにディレクトリが追加されますが、プロセスに対してローカルで変更が加えられます。

ホストアプリは、DLLをロードする直前にSetDllDirectoryを呼び出す必要があります。次に、変更された検索パスを使用して、DLLの依存関係が解決されます。DLLが正常にロードされたら、SetDllDirectoryを再度呼び出して、検索パスをデフォルト値に戻します。

ホストを制御していない場合は、これを実装するのが難しい場合があります。DLLでSetDllDirectoryを呼び出す必要がありますが、そうすると手遅れになります。ホストとプラグインの間に別のレイヤーを配置できます。そのレイヤーはDLL検索パスを変更し、LoadLibraryを使用して暗黙的なリンクを使用するDLLをロードできます。

もう1つの明らかなオプションは、暗黙的なリンクの使用を停止することです。LoadLibraryを使用して、すべての依存関係を解決します。それは実際には思ったほど難しくはありません。

最新のDelphiでは、遅延ロードも使用できます。DLL検索パスが変更されている限り、遅延ロードされたインポートを呼び出す前に、それらは解決されます。

于 2013-03-06T07:34:52.810 に答える