イメージのベースアドレス
Delphi コンパイラ指令のリスト:インデックス への移動
種類 |
パラメータ |
構文 |
{$IMAGEBASE number} |
デフォルト |
{$IMAGEBASE $00400000} |
スコープ |
グローバル |
$IMAGEBASE 指令は,アプリケーション,DLL,またはパッケージのデフォルトロードアドレスを制御します。number 引数は,イメージベースアドレスを指定する 32 ビットの整数値でなければなりません。また,number 引数は $00010000 以上でなければならず,16 ビットより小さい部分は無視され,ゼロとみなされます。この数値は 64K の倍数でなければなりません(つまり,16 進数の数値は,最後の 4 桁が 0 でなければなりません)。そうでない場合は,最も近い倍数に丸められ,コンパイラメッセージが表示されます。
モジュール(アプリケーションまたはライブラリ)がプロセスのアドレススペースに読み込まれると,Windows はモジュールをそのデフォルトイメージアドレスに置こうとします。これに失敗した場合,つまり指定アドレスがすでに別のモジュールに使用されていた場合,モジュールは Windows が実行時に決定したアドレスに再度読み込まれます。
アプリケーションのイメージベースアドレスを変更することはめったにありません。しかし,ライブラリの場合には,デフォルトイメージベースアドレスの $00400000 がほとんど確実に使用できないため,$IMAGEBASE 指令を使ってデフォルト以外のイメージベースアドレスを指定することをお勧めします。DLL イメージの推奨アドレス範囲は,$40000000~$7FFFFFFF です。この範囲のアドレスは,Windows NT/2000 および Windows 95/98 の両方のプロセスにおいて必ず使用できます。
Windows がイメージベースアドレスでの DLL(またはパッケージ)の読み込みに成功すると,移動の調整が必要なくなるため,読み込み時間が少なくなります。さらに,ライブラリを使用する複数のプロセスで指定したアドレス範囲を使用できる場合,DLL のイメージのコード部分をプロセス間で共有することができます。したがって,読み込み時間もメモリ消費量も削減されます。
メモ: メモ:$IMAGEBASE 指令は,-K コマンドラインコンパイラ指令オプションにより供給される値をすべてオーバーライドします。