2

別の DLL 内から DLL をロードする必要があります。それを DllMain にロードしたくなるかもしれませんが、それは「悪い考え」であるという説得力のあるドキュメントが既に存在します。

あまり具体的ではない質問をするリスクがあります: 別の DLL から DLL をロードするベスト プラクティスはありますか?

現在のプロジェクトでは、メイン DLL にクラスがあります。そのクラスのコンストラクターから 2 番目の DLL を読み込みます。ただし、そのクラスは DLL で複数回インスタンス化できるため、LoadLibrary を再度呼び出さないように、DLL が以前にロードされたかどうかを示す変数を保持しています。これはどういうわけかそれが良い解決策だとは思わないので、私の質問です。

4

1 に答える 1

3

DLLによって異なります。基本的に、次のオプションがあります。

  1. そのDLLのLIBに対してリンクして、自動的にロードします
  2. ライブラリのロード時に他のDLLをロードし、アンロードする前にアンロードします
  3. 使用する前に他のDLLをロードしてから、アンロードします

1を選択すると、「DLL1のロードに失敗しました」などのDLL1をロードしようとしたときにDLL2が見つからない場合、非常に奇妙なメッセージが表示されます。そして、顧客はそれがDLL2の欠落によるものであることを決して知りません。したがって、DLL2が正しくインストールされているかどうかを100%確信できない場合は、このソリューションを使用するのは好きではありません。

ただし、DLL2を手動でロードする場合(LoadLibrary)、意味のあるメッセージを表示する機会があります。

DLLに明確な開始点と終了点がある場合は、2を選択できます。これは、DLLが1つまたはごく少数の関数、つまり他のオブジェクトのファクトリを作成する関数をエクスポートする場合に当てはまります。その後、ファクトリでロード/アンロードできます。

このロード/アンロードを頻繁に実行しない場合は、3を選択できます。

さらに、DLL2へのハンドルを1つだけ保持する必要はありません。LoadLibrary / FreeLibraryは複数回呼び出すことができ、参照カウントを行うのはフレームワークです。

したがって、状況が許す限り、これら3つのソリューションのいずれかを選択できます。元のソリューションを使用する必要があるのは、明確なエントリポイントがなく、DLL2を必要とする関数を頻繁に呼び出す場合のみです。

于 2012-09-07T15:21:14.980 に答える