2012-02-21 12 views
2

This questionは、現在実行されているコードを含むDLLのハンドルを取得する方法を尋ねます。 answersのいずれかのA linkは、アドレス__ImageBaseをモジュールハンドルとして使用することを示します。これは私のために働く。__ImageBaseまたはGetModuleHandleEx()を使用してフレームワークを取得できるときに、フレームワークが独自のHMODULEを格納するのはなぜですか?

私の質問は、現在のモジュールのハンドルを取得するのが驚くほど簡単であることを考えると、MFCのようなフレームワークは通常、グローバル変数のDllMain()に渡されるインスタンスハンドルを格納します。 __ImageBaseに頼らない理由はありますか?

Raymond Chenによれば、__ImageBaseはMicrosoftリンカーのみです。 GetModuleHandleEx()を使用するリンカーに依存しない方法を含む、より正確な答えを持つanother questionがあります。 VirtualQuery()を使用してWin2000以前のソリューションもあります。質問は有効です:簡単に検索できるときにベースアドレスを保存する理由

+1

で純粋なWinAPIの中で行うことができます

それは簡単に説明していますので、MFCは、__ImageBaseとGetModuleHandleExの両方に先行します。あなたのコードベースはそれよりも前かもしれませんし、元のプログラマーはそれらについて知らなかったかもしれません。モジュールハンドルを保存するのは完全に良い解決策なので、誰かが他のオプションを探す必要はありませんでした。 –

+0

ハンドルが格納されている場所を認識しない関数にハンドルを渡す必要があることを除いて。 - 歴史的背景も良い点です。 – krlmlr

答えて

6

__ImageBaseは、Microsoft linkerによって提供されるトリックであり、他のコンパイラ/リンカでは動作しない可能性があります。フレームワークが他のツールセットをサポートしていないとしても、この魔法のシ​​ンボルについてはわからないかもしれません。同じことは、それのルックスからVirtualQueryまたはGetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,...)

+0

ありがとうございます。私の質問は、設計上の問題、つまり値を保存することと、それを「計算する」ことの2点です。 – krlmlr

+1

__ImageBaseはまだPEファイルの再配置セクションにおそらくどこかに格納されています。コンピューティングはどちらも遅く、より多くのコードが必要です。 – Anders

関連する問題