我被要求用C ++创建一个Delphi兼容的dll来进行简单的64位内存管理。
背景是Delphi中的系统需要分配大量内存,这些内存在32位可寻址空间之外。 Delphi开发人员向我解释说,他无法使用他可用的Delphi命令分配内存。他说他可以保存64位地址,所以他只想调用我提供的函数来分配内存并向他返回64位指针。然后是另一个函数,以便以后释放内存。
现在,我只能使用VS 2008,所以首先我甚至不确定我是否可以创建一个兼容Delphi的dll。
任何Delphi专家都会帮助我。也许有一种方法可以实现他所需要的而无需重新发明轮子。其他开发人员之前必须在Delphi中遇到过这个问题。
所有评论都表示赞赏。
答案 0 :(得分:7)
只有64位进程可以处理64位内存。 64位进程只能加载64位dll,32位进程只能加载32位dll。 Delphi的编译器只能生成32位二进制文件。
因此32位Delphi exe无法加载64位c ++ dll。它可以加载一个32位的c ++ dll,但那个dll将无法处理64位的内存空间。你有点坚持这个解决方案。
Delphi可以使用正确的编译器选项和Windows开关来解决3GB的内存问题。如果使用Physical Address Extension,则32位进程可以访问更多内存。然后,它需要通过使用Address Windowing Extensions来交换存储器页面进出32位存储器。
答案 1 :(得分:6)
Delphi指针是32位的。期。您的Delphi开发人员可能能够“存储”您想要返回给他的64位值,但他无法访问他们指向的内存,因此这非常徒劳。
以前,我写过: -
启用了64位版本的Delphi Codegear/Embarcadero's road map 为“2009年中期”。产品质量 似乎(终于!)正在服用 击中发货日期的优先顺序 确切地说,所以不要屏住呼吸......
但是,2010年8月,Embarcadero发表了new roadmap here。这没有给出具体日期,但提到 64位编译器预览,预计可用性,2011年上半年。
答案 2 :(得分:5)
您可以查看Free Pascal,因为它包含64位版本,并且主要是Delphi兼容语法。
答案 3 :(得分: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。
答案 4 :(得分:2)
您可能还想添加一种方法来固定和取消固定该64位指针到32位内存地址。由于这是Delphi,我很确定它是特定于Windows的,所以你不妨使用Address Windowing Extensions。这样,您可以支持分配,释放,固定和取消固定内存到32位地址范围,并仍然利用64位内存分配空间。假设用户实际上将提交内存,使其适合32位虚拟地址空间。