2

私のシナリオは次のとおりです。私のアプリケーションは特定の DLL に依存しています (リンク中にその lib を使用します)。ただし、アプリケーションの実行時に、LoadLibrary を使用してその DLL を明示的にロードしたいと考えています。ただし、既定では、その DLL が必要なスコープにコードが到達すると、環境は自動的にそれを検索して読み込みます。私はこの動作を無効にしたいと考えており、アプリケーションがその DLL に属するコードを実行する必要があるポイントに達した場合は、自動的にロードするのではなくクラッシュすることを好みます (したがって、DLL はロードされるだけです)。明示的に LoadLibrary を呼び出したためです)。
その間、私は遅延ロード機能を使用しています (したがって、ロード トリガーは、DLL を実際にロードする必要がある場合にのみ発生します)。ただし、DLL がまだロードされていない場合は、アプリケーションがクラッシュすることを望みます。

おそらく、これを達成する方法に精通している人はいますか?

4

6 に答える 6

6

を使用する場合はLoadLibrary、アプリケーションをインポート ライブラリにリンクしないでください。PE 形式は未解決の外部をサポートしていないため、ヘッダーとdllimport、またはLoadLibraryGetProcAddress関数へのポインターを使用します。

于 2009-10-03T16:00:23.337 に答える
4

(リンク時にlibを使用します)

LoadLibraryを使用して手動でロードする場合は、そのファイルをリンカーにGetProcAddress渡さないでください。*.lib

于 2009-10-03T15:58:56.940 に答える
2

DLL のインポート ライブラリ (.lib ファイル) にリンクしないことで、自動読み込みを防ぐことができます。その後、LoadLibrary を使用して、必要なときにいつでも DLL を手動でロードできます。

この種のことを行うことについてのブログエントリをここに投稿しました。

于 2009-10-03T16:00:59.967 に答える
1

delayload メカニズムをフックできます。提供する関数に設定__pfnDliNotifyHook2し、そのフックでアプリケーションを終了するだけです。

于 2009-10-05T10:32:26.457 に答える
0

delayload機能は、スコープではなく、最初の関数呼び出しまでdllをロードしません。そのdllを呼び出すグローバル初期化子がある場合は、それがスコープベースであると考える理由かもしれません。私の会社では、問題なく使用する前にLoadLibraryを呼び出す手法を使用しています。私はあなたの問題をさらに掘り下げることを提案します。

于 2009-10-03T16:15:59.167 に答える
0

これはあなたが必要とするものですか:http://msdn.microsoft.com/en-us/library/151kt790 (VS.80).aspx ?

つまり、DLLをロードするための独自の関数を提供し、そこからアプリケーションをクラッシュさせることができます。詳細については、提供されているリンクを参照してください。

于 2009-10-03T16:27:04.793 に答える