Wie aktiviere ich meine 32-bit-Delphi-Anwendung zu verwenden, 4 GB Speicher auf 64-bit-windows (via Wow64.exe)?
Gemäß dieser MSDN-Seite:
WOW64 ermöglicht, 32-bit-Anwendungen
profitieren Sie von der 64-bit-kernel.
Daher werden 32-bit-Anwendungen verwenden können
eine größere Anzahl von kernel-handles und
Fenster-handles. Aber, 32-bit
Anwendungen möglicherweise nicht in der Lage sein zu erstellen
wie viele threads unter WOW64, wie Sie
kann wenn, die nativ auf x86-basierten
Systeme, weil WOW64 weist eine
zusätzliche 64-bit-stack (in der Regel 512
KB) für jeden thread. Darüber hinaus einige
Höhe des Adressraums reserviert ist
für WOW64 selbst und die Daten
Strukturen, die es verwendet. Die Höhe
reserviert hängt von der Prozessor -;
mehr ist reserviert auf den Intel Itanium
als auf dem x64-Prozessor.Wenn die Anwendung der
IMAGE_FILE_LARGE_ADDRESS_AWARE flag
Satz in der Bild-header, die jeweils 32-bit
Anwendung erhält 4 GB virtuellen
Adresse Platz in der WOW64 -
Umwelt. Wenn die
IMAGE_FILE_LARGE_ADDRESS_AWARE flag
nicht festgelegt ist, wird jedes 32-bit-Anwendung
erhält 2 GB des virtuellen Adressraums
in der WOW64 Umgebung.
Wie kann ich effektiv setzen Sie den IMAGE_FILE_LARGE_ADDRESS_AWARE-flag in mein Delphi 2007-Anwendung, so dass ich kann mein 32-bit-Wow64-Anwendung bewusst und Adresse bis zu vollen 4 GB Arbeitsspeicher?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen diese CodeCentral Artikel: Mit mehr als 3 GB Speicher in einem 32-bit-Delphi-Programm.
In modernen Delphi-Versionen fügen Sie einfach die compiler-Direktive der dpr:
{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
Verwendung der linker-Direktive $SetPEFlags:
Den
IMAGE_FILE_LARGE_ADDRESS_AWARE
Konstante ist definiert in Windows.pas. Ich erinnere mich nicht, welche Delphi-version enthalten, allerdings.In Delphi 2007 finden Sie SetPEFlags dokumentiert in "PE (portable executable) header-flags (Delphi)".
Einige nützliche
IMAGE_FILE_HEADER
flags:{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} //$0020
Anwendung verarbeitet werden kann Adressen, die größer als 2 GB.
{$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP} //$0800
Wenn das Bild auf dem Netzwerk, kopieren Sie es und führen Sie es aus der swap-Datei.
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP} //$0400
Wenn das Bild auf Wechselmedien kopieren Sie es und führen Sie es aus der swap-Datei.
Einige IMAGE_FILE_HEADER flags:
{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_NX_COMPAT} //$0100
Das Bild ist kompatibel mit der data execution prevention (DEP).
{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE} //$0040
Die DLL kann verlegt werden bei einer Last-Zeit. (aka ASLR - Address Space Layout Randomization)
{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE} //$8000
Das Bild ist terminal server beachten.
Beachten Sie, dass es Annahmen sind fest in den compiler und RTL, die Zeiger, interpretiert Sie als vorzeichenbehaftete 32-bit-Ganzzahlen, wird nie negativ sein. Zum Beispiel, der compiler wird nicht zulassen, dass die Erstellung einer Datenstruktur, die größer als 2 GB in der Größe, und bestimmte Grenz-Kontrollen in der RTL-davon ausgehen, dass z.B.
Index + Count < 0
bedeutete die addition ist übergelaufen, woIndex
kann ein index in ein byte-array. Weitere Probleme können auftauchen in den Speicher-manager.Test gut und auf Ihr eigenes Risiko gehen.
Wenn Sie dies tun, stellen Sie sicher, dass FastMM, denn es unterstützt > 2GB Zeiger. In früheren Delphi-Speicher-Manager nicht gut funktionieren, wie Barry Kelly, die bereits beschrieben.