2008-08-29 187 views
8

我被要求在C++中创建一个兼容Delphi的dll来完成简单的64位内存管理。64位内存分配

背景是Delphi中的系统需要分配大量内存,这些内存在32位可寻址空间之外。德尔福开发人员向我解释说,他无法为他提供的Delphi命令分配内存。他说他可以保存一个64位地址,所以他只是想调用一个我提供的函数来分配内存并返回一个64位指针给他。然后再用另一个功能来释放内存。

现在,我只有VS 2008在我的处置,所以首先我甚至不确定我可以创建一个Delphi兼容的DLL。

任何德尔菲专家都在帮助我。也许有一种方法可以在不重新发明车轮的情况下实现他的要求。其他开发人员必须在Delphi中遇到过这个问题。

所有评论赞赏。

+0

他也需要函数来读取/写入数据到该内存块,因为他不能从一个32位的进程中完成它,它不能是一个普通的DLL,因为32位进程将无法加载它。基本上,它要求你写一些非常类似于旧时代的EMS/XMS内存“扩展器”...... – 2011-05-27 07:11:52

回答

7

只有64位进程可以寻址64位内存。 64位进程只能加载64位dll,而32位进程只能加载32位dll。 Delphi的编译器只能创建32位二进制文​​件。

所以一个32位德尔福的exe文件不能加载你的64位c + + dll。它可以加载一个32位的c + + dll,但那个dll将无法解决64位内存空间。你有这种解决方案。 Delphi可以用正确的编译器选项和Windows交换机地址3GB的内存没有问题。如果使用Physical Address Extension,则可以通过32位进程访问更多内存。然后它需要通过使用Address Windowing Extensions来交换内存页面进出32位内存。

+0

此外,32位进程可以在64位操作系统中使用高达〜4GB的内存。 – samir105 2009-09-07 07:43:51

+0

这不再是完全准确的。现在Embarcadero发布了一个64位编译器,可能想更新你的答案。 – 2012-07-03 15:17:10

6

德尔福指针是32位。期。您的Delphi开发人员可能能够“存储”您想要返回给他的64位值,但他无法访问他们指向的内存,所以这非常没用。

以前,我会写: -

德尔福的64位版本是 Codegear/Embarcadero's road map 的 “2009年中”。产品质量 似乎是(最后!)采取 优先于打发货日期究竟 ,所以不要屏住呼吸......

但是,在2010年8月,Embarcadero公司公布了new roadmap here。这并没有给出具体的日期,但提到了一个64位编译器预览,预计可用性,2011年上半年

+1

最近的消息称64位编译器将于8月份左右发布(http://tech.turbu-rpg.com/351/odd-timing),目前正在进行beta测试。准确发布的内容仍不得而知。 – 2011-05-27 09:56:11

+1

但是这一次,它看起来像(Delphi x64)正在发生。现在有一个针对Delphi x64的测试版:http://www.embarcadero.com/products/delphi/64-bit – PhiS 2011-05-27 12:19:28

2

您可能还想添加一种方法来将该64位指针引脚和解除绑定到32位存储器地址。由于这是德尔福,我敢肯定这是Windows的具体情况,所以你不妨使用Address Windowing Extensions。这样,您可以支持将内存分配,释放和锁定以及将内存解锁到32位地址范围,并仍然利用64位内存分配空间。假设用户将实际提交内存,使其适合32位虚拟地址空间。

5

您可能会看看Free Pascal,因为它包含64位版本,并且大多数是Delphi兼容语法。

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。