Ich wurde gebeten, eine Delphi-kompatible DLL in C ++ zu erstellen, um eine einfache 64-Bit-Speicherverwaltung durchzuführen.
Der Hintergrund ist, dass das System in Delphi eine Menge Speicherblöcke reservieren muss, die weit außerhalb des adressierbaren 32-Bit-Bereichs liegen. Der Delphi-Entwickler erklärte mir, dass er mit den ihm zur Verfügung stehenden Delphi-Befehlen keinen Speicher zuordnen könne. Er sagt, dass er eine 64-Bit-Adresse halten kann, also will er nur eine Funktion aufrufen, die ich ihm zur Verfügung stelle, um den Speicher zuzuordnen und ihm einen 64-Bit-Zeiger zurückzugeben. Dann eine andere Funktion, um den Speicher später freizugeben.
Nun, ich habe nur VS 2008 zu meiner Verfügung, also bin ich nicht einmal sicher, ob ich überhaupt eine Delphi-kompatible DLL erstellen kann.
Irgendwelche Delphi-Experten kümmern sich darum, mir zu helfen. Vielleicht gibt es einen Weg, um das zu erreichen, was er braucht, ohne das Rad neu zu erfinden. Andere Entwickler müssen das schon mal in Delphi gesehen haben.
Alle Kommentare geschätzt.
Nur 64-Bit-Prozesse können 64-Bit-Speicher adressieren. Ein 64-Bit-Prozess kann nur 64-Bit-DLLs laden und 32-Bit-Prozesse können nur 32-Bit-DLLs laden. Delphi Compiler kann nur 32-Bit-Binärdateien erstellen.
So kann eine 32-Bit-Delphi-Exe Ihre 64-Bit-C ++ - DLL nicht laden. Es könnte eine 32-Bit-C ++ - DLL laden, aber dann wäre diese DLL nicht in der Lage, den 64-Bit-Speicherplatz zu adressieren. Sie sind irgendwie mit dieser Lösung festgefahren.
Delphi könnte mit den richtigen Compiler-Optionen und Windows-Switches problemlos 3 GB Speicher adressieren. Auf noch mehr Speicher kann mit einem 32-Bit-Prozess zugegriffen werden, wenn Physical Address Extension verwendet wird. Es muss dann Speicherseiten innerhalb und außerhalb des 32-Bit-Speichers durch die Verwendung von austauschen Adress-Fenstererweiterungen .
Delphi-Zeiger sind 32-Bit. Zeitraum. Ihr Delphi-Entwickler ist möglicherweise in der Lage, die 64-Bit-Werte, die Sie ihm zurückgeben wollen, zu "speichern", aber er kann nicht auf den Speicher zugreifen, auf den er zeigt, also ist es ziemlich sinnlos.
Zuvor hatte ich geschrieben: -
Eine 64-Bit-Version von Delphi ist aktiviert Codegear / Embarcaderos Roadmap für "Mitte 2009". Produktqualität scheint (endlich!) zu nehmen Vorrang vor dem Schlagen von Schiffsdaten genau, also halte nicht den Atem an ...
Aber im August 2010 hat Embarcadero hier eine neue Roadmap veröffentlicht . Dies gibt keine bestimmten Daten, sondern erwähnt eine 64-Bit-Compiler-Vorschau mit Projected Availability, 1. Halbjahr 2011 .
Sie können sich Free Pascal ansehen, da es eine 64-Bit-Version enthält und hauptsächlich mit Delphi kompatibel ist.
Um Speicher zuzuteilen, der von mehreren Prozessen gemeinsam genutzt wird, sollten Sie eine Memory-Mapped-Datei verwenden.
Der Code, der unter Ссылка zur Verfügung steht, kann für die Kommunikation zwischen einem 32-Bit- und einem 64-Bit-Prozess verwendet werden .
Hier sind die Schritte:
Es liegt an Ihnen, ein benutzerdefiniertes Binärlayout in der Memory-Mapped-Datei zu erstellen, um alle Daten freizugeben.
Vom Entwurf her sind Speicherabbilddateien schnell (es handelt sich um eine Kernel- / x86-CPU-Funktion) und können sehr viel Speicher verarbeiten (bis zu 1 GB für einen 32-Bit-Prozess aus meinem Experiment).
Diese Art der Kommunikation wird von Ссылка verwendet, um eine 64-Bit-DLL aus einem 32-Bit-Delphi-Programm aufzurufen.
Sie können auch einen Weg hinzufügen, um den 64-Bit-Zeiger an eine 32-Bit-Speicheradresse anzuheften und zu lösen. Da dies Delphi ist, bin ich ziemlich sicher, dass es Windows-spezifisch ist, also können Sie auch Adress-Fenstererweiterungen . Auf diese Weise können Sie das Zuweisen, Freigeben und Fixieren sowie das Entfernen von Speicher zu einem 32-Bit-Adressbereich unterstützen und trotzdem einen 64-Bit-Speicherzuordnungsbereich nutzen. Angenommen, der Benutzer schreibt den Speicher tatsächlich so, dass er in den virtuellen 32-Bit-Adressraum passt.