8

シンプルな 64 ビット メモリ管理を行うために、C++ で Delphi 互換の dll を作成するように依頼されました。

その背景には、Delphi のシステムが、32 ビットのアドレス指定可能空間の外側にある大量のメモリ チャンクを割り当てる必要があるということがあります。Delphi の開発者は、利用可能な Delphi コマンドでメモリを割り当てることができないと説明してくれました。彼は 64 ビット アドレスを保持できると言っているので、私が提供する関数を呼び出してメモリを割り当て、64 ビット ポインターを彼に返したいだけです。次に、後でメモリを解放する別の関数。

今、私は自由にVS 2008しか持っていないので、最初にDelphi互換のdllを最初に作成できるかどうかさえわかりません。

Delphi の専門家なら誰でも私を助けてくれます。車輪を再発明することなく、彼が必要とするものを達成する方法があるかもしれません. 他の開発者は、Delphi で以前にこれに遭遇したに違いありません。

すべてのコメントに感謝します。

4

5 に答える 5

7

64 ビット メモリをアドレス指定できるのは、64 ビット プロセスだけです。64 ビット プロセスは 64 ビット DLL のみをロードでき、32 ビット プロセスは 32 ビット DLL のみをロードできます。Delphi のコンパイラは、32 ビット バイナリしか作成できません。

そのため、32 ビットの Delphi exe は 64 ビットの c++ dll をロードできません。32 ビットの C++ DLL をロードできますが、その DLL は 64 ビットのメモリ空間をアドレス指定できません。あなたはこの解決策に行き詰まっています。

Delphi は、適切なコンパイラ オプションと Windows スイッチを使用して、問題なく 3 GB のメモリをアドレス指定できます。Physical Address Extensionを使用すると、32 ビット プロセスでさらに多くのメモリにアクセスできます。次に、 Address Windowing Extensionsを使用して、32 ビット メモリとの間でメモリ ページをスワップする必要があります。

于 2008-08-29T10:26:22.037 に答える
6

Delphiポインタは32ビットです。限目。Delphi開発者は、返したい64ビット値を「保存」できるかもしれませんが、彼らが指しているメモリにアクセスできないため、かなり無駄です。

以前、私は書いていました:-

Delphiの64ビットバージョンは、 Codegear/Embarcaderoの 「2009年半ば」のロードマップにあります。製品の品質は(ついに!)出荷日を正確に打つことよりも優先されているようですので、息を止めないでください...

しかし、2010年8月、Embarcaderoはここに新しいロードマップを公開しました。これは特定の日付を示していませんが、2011年上半期の予定されている可用性を備えた64ビットコンパイラプレビューについて言及しています。

于 2008-08-29T22:07:31.497 に答える
5

Free Pascalには 64 ビット バージョンが含まれており、ほとんどが Delphi と互換性のある構文であるため、Free Pascal を参照してください

于 2008-09-12T02:16:34.533 に答える
4

複数のプロセスで共有されるメモリを割り当てるには、メモリ マップド ファイルを使用する必要があります。

http://www.delphifaq.com/faq/delphi_windows_API/f348.shtmlで入手できるコードは、32 ビット プロセスと 64 ビット プロセス間の通信に使用できます。

手順は次のとおりです。

  • ディスク上またはメモリ上にメモリ マップト ファイルを作成します。
  • ファイルの変更を通知するミューテックスを作成します。
  • 一方の端では、メモリ マップされたファイルにデータを書き込みます。
  • 次に、ミューテックスにフラグを立てます。
  • もう一方の端はミューテックス通知を受け取ります。
  • 次に、メモリ マップド ファイルからデータを読み取ります。

データを共有するために、メモリ マップド ファイルにカスタム バイナリ レイアウトを作成するのは、ユーザー次第です。

設計上、メモリ マップト ファイルは高速 (カーネル レベル / x86 CPU 機能) であり、巨大なメモリ (私の実験では 32 ビット プロセスで最大 1 GB) を処理できます。

この種の通信は、http: //cc.embarcadero.com/Author/802978 で 32 ビット Delphi プログラムから 64 ビット DLL を呼び出すために使用されます。

于 2011-05-27T06:36:36.757 に答える
2

また、その 64 ビット ポインターを 32 ビット メモリ アドレスに固定および固定解除する方法を追加することもできます。これは Delphi であるため、Windows 固有のものであると確信しているため、Address Windowing Extensionsを使用することもできます。これにより、32 ビット アドレス範囲へのメモリの割り当て、解放、固定および固定解除をサポートしながら、64 ビットのメモリ割り当て空間を活用できます。ユーザーが実際にメモリをコミットして、32 ビットの仮想アドレス空間に収まるようにすると仮定します。

于 2008-08-29T23:08:35.280 に答える