8

我被要求在 C++ 中创建一个与 Delphi 兼容的 dll 来进行简单的 64 位内存管理。

背景是 Delphi 中的系统需要分配大量的内存块,这些内存块可以很好地超出 32 位可寻址空间。Delphi 开发人员向我解释说,他无法使用可用的 Delphi 命令分配内存。他说他可以持有一个64位的地址,所以他只想调用我提供的一个函数来分配内存并返回一个64位的指针给他。然后另一个函数稍后释放内存。

现在,我只有 VS 2008 可供我使用,所以首先我什至不确定我是否可以首先创建一个与 Delphi 兼容的 dll。

任何德尔福专家都愿意帮助我。也许有一种方法可以在不重新发明轮子的情况下实现他的要求。其他开发人员以前在 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 位内存空间。你有点坚持这个解决方案。

使用正确的编译器选项和 Windows 开关,Delphi 可以毫无问题地处理 3GB 内存。如果 32 位进程使用物理地址扩展,则可以访问更多内存。然后它需要通过使用地址窗口扩展将内存页面交换进出 32 位内存。

于 2008-08-29T10:26:22.037 回答
6

Delphi 指针是 32 位的。时期。您的 Delphi 开发人员可能能够“存储”您想要返回给他的 64 位值,但他无法访问它们指向的内存,所以这是徒劳的。

以前,我写过:-

一个 64 位版本的 Delphi 在 Codegear/Embarcadero 的 “2009 年年中”路线图上。产品质量似乎(终于!)优先于准确的发货日期,所以不要屏住呼吸......

但是,在 2010 年 8 月,Embarcadero在这里发布了一个新的路线图。这没有给出具体日期,但提到了64-bit Compiler PreviewProjected Availability, 1st Half of 2011

于 2008-08-29T22:07:31.497 回答
5

您可能会看一下Free Pascal,因为它包含 64 位版本,并且大部分是与 Delphi 兼容的语法。

于 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 回答