Image-Basisadresse

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Liste der Delphi-Compiler-Direktiven - Index


Typ

Parameter

Syntax

{$IMAGEBASE Zahl}

Vorgabe

{$IMAGEBASE $00400000}

Bereich

Global



Die Direktive $IMAGEBASE definiert die Standardladeadresse für eine Anwendung, DLL oder ein Package. Das Argument Zahl muss ein 32-Bit-Intergerwert sein, der die Image-Basisadresse angibt. Zahl muss gleich oder größer sein als $00010000; die geringwertigen 16 Bit des Arguments werden ignoriert oder sollten Nullen sein. Zahl muss ein Vielfaches von 64K sein (die entsprechende Hexadezimalzahl muss also mit vier Nullen enden); ist das nicht der Fall, rundet der Compiler die Zahl auf das nächstkleinere Vielfache ab und gibt eine Meldung aus.

Wird ein Modul (Anwendung oder Bibliothek) in den Adressraum eines Prozesses geladen, versucht Windows, das Modul an dessen Standard-Image-Basisadresse abzulegen. Sollte das nicht möglich sein, weil die vorgegebene Adresse bereits belegt ist, wird das Modul an einer Adresse abgelegt, die Windows während der Laufzeit bestimmt (Adressverschiebung).

Für eine Änderung der Image-Basisadresse einer Anwendung gibt es so gut wie nie einen Grund. Dagegen sollten Sie für eine Bibliothek mit der Direktive $IMAGEBASE eine andere als die Standardadresse als Image-Basisadresse angeben, da die Standardadresse $00400000 wahrscheinlich immer belegt sein wird. Der empfohlene Adressbereich für DLL-Images liegt zwischen $40000000 und $7FFFFFFF. Adressen in diesem Bereich stehen unter Windows NT/2000 und Windows 95/98 immer für Prozesse zur Verfügung.

Sofern Windows eine DLL oder ein Package an der zugehörigen Image-Basisadresse ablegen konnte, wird die Ladezeit verringert, weil keine Anpassungen aufgrund von Adressverschiebungen erforderlich sind. Wenn zudem der vorgegebene Adressbereich in mehreren Prozessen, die die Bibliothek benutzen, verfügbar ist, können Teile des DLL-Image-Codes von den Prozessen gemeinsam benutzt werden, wodurch sich die Ladezeit verringert und weniger Arbeitsspeicher belegt wird.

Anmerkung:  $IMAGEBASE überschreibt jeden Wert, der mit der Kommandozeilen-Direktive –K angegeben wurde.