2016-06-27 14 views
3

私は大きなレガシーC++アプリケーション(Visual Studio 2010)を持っていますが、特定のdllがロードされる前にいくつかのコードを実行する必要があります。問題は、コードを実行する前にdllがロードされていることです。ロードするトリガーが何であるか把握しようとしています。C++プログラム(MFC)でdllがロードされている場所を確認してください

リンクオプションでDLLの/ DELAYLOADを指定しました。これにより、DLLのロードが必要になる前に停止する必要があります。しかし、コードを実行する前にまだロードされています。アプリケーションはMFCなので、私のエントリポイントはCWinApp :: InitApplication()のオーバーライドです。

dllの型を参照しているアプリケーションのグローバル変数である必要がありますが、変数の検索方法がわかりません(コードベースが大きく、グローバルに一貫して名前が付けられていません)。

どのようにDLLの負荷を引き起こしているか、またはグローバル変数を見つける方法を見つけるためのアイデアはありますか?

+0

'LoadLibrary'呼び出しを探したり、暗黙的に' #pragma comment(lib ...) '行を読み込んだ場合は、 – PaulMcKenzie

+1

@PaulMcKenzie:OPは、ユーザーコードが実行される前にロードされているDLLを探しています。 'CWinApp :: InitApplication'はCの' main'の道徳的同等物です。 OPは、明示的な 'LoadLibrary'呼び出しを探しているわけではなく、リンカーディレクティブ(彼らが既に知っている、ライブラリがリンクされていること)を探しているわけでもありません。彼らはなぜ、遅延ロードライブラリがロードするのか、その理由を探していますが、まだエクスポートは触れられていないようです。 – IInspectable

+3

delay-load *ヘルパ関数*をオーバーライドして、ロードするDLLをトリガするシンボルを確認できます。 https://msdn.microsoft.com/en-us/library/09t6x5ds(v=vs.100).aspxを参照してください。 – dxiv

答えて

3

delay-load helper関数のブレークポイントを設定することで問題を解決しました。__delayLoadHelper2です。この機能は、次の場所にあります。

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\delayhlp.cpp 

遅延ロード用にマークされたDLLがロードされたときに呼び出されます。

ブレークポイントを__delayLoadHelper2に設定し、ヒットしたときにコールスタックを表示しました。これは私のコードでdll負荷を引き起こしていた関数を示していました。

これは、dllから型を作成したグローバルシングルトンコンストラクタによってトリガされました。このコードはCWinApp::InitApplication()の前に実行されます。

+0

デバッガがどのようにオブジェクトコードをソース(delayhlp.cpp)にマップするか、私は理解していません。 Visual Studioに同梱の.pdbファイルが見つかりませんでした。あなたは知っていますか?これはどうやって(そしてなぜ)? – IInspectable

+1

@IInspectable Delayhlp.cppは(ソースファイルから引用して) 'ビルド命令:cl -c -O1 -Z7 -Zl -W3 delayhlp.cpp'でコンパイルされます。 '/ Z7'は、デバッグ情報がオブジェクトファイルに含まれていることを意味し、プログラムがリンクするdelayimp.libになります。[Debug Information Format](https://msdn.microsoft.com/en-us) /library/958x11bc.aspx): '.pdbファイルを使用せずにデバッグ情報を含むライブラリを作成するには、コンパイラのC 7.0互換(/ Z7)オプションを選択する必要があります。 – dxiv

+1

@dxiv:パーフェクト!デバッグ情報とオブジェクトコードを分離するためにマイクロソフトのコンパイラに普遍的に普及しているので、最終的な実行可能モジュールにデバッグ情報を埋め込むことはできませんでした。 delayimp.libのためにこれを行うことはすぐれたアプリケーションで、すぐに使用できる遅延ロードのデバッグを可能にします。時々、私は細部への注意に感銘を受けた、それは他の時代を補うものです。私はそうではありません... – IInspectable

関連する問題