如何让我的32位Delphi应用程序在64位窗口上使用4GB内存(通过Wow64.exe)?

时间:2009-12-04 20:06:49

标签: delphi 64-bit 32-bit

根据MSDN page

  

WOW64支持32位应用程序   利用64位内核。   因此,32位应用程序可以使用   更多的内核句柄和   窗口把手。但是,32位   应用程序可能无法创建   和WOW64一样多的线程   可以在基于x86的本机上运行   系统因为WOW64分配了一个   额外的64位堆栈(通常为512   KB)为每个线程。另外,一些   保留地址空间量   对于WOW64本身和数据   它使用的结构。数量   保留取决于处理器;   更多是在Intel Itanium上保留的   而不是在x64处理器上。

     

如果申请有   IMAGE_FILE_LARGE_ADDRESS_AWARE标志   在图像标题中设置,每个32位   应用程序接收4 GB的虚拟   WOW64中的地址空间   环境。如果   IMAGE_FILE_LARGE_ADDRESS_AWARE标志是   没有设置,每个32位应用程序   接收2 GB的虚拟地址空间   在WOW64环境中。

如何在我的Delphi 2007应用程序中有效设置IMAGE_FILE_LARGE_ADDRESS_AWARE标志,以便我可以使我的32位应用程序Wow64 识别并解决最多4GB内存的问题?

4 个答案:

答案 0 :(得分:12)

使用链接器指令$ SetPEFlags:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

IMAGE_FILE_LARGE_ADDRESS_AWARE常量在Windows.pas中定义。我不记得哪个Delphi版本首先包含它。

在Delphi 2007中,您将找到"PE (portable executable) header flags (Delphi)"中记录的SetPEFlags。

一些有用的IMAGE_FILE_HEADER标记

  • {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} //$0020

    应用程序可以处理大于2 GB的地址。

  • {$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP} //$0800

    如果图像在网络上,请将其复制并从交换文件中运行。

  • {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP} //$0400

    如果图像位于可移动媒体上,请将其复制并从交换文件中运行。

一些IMAGE_FILE_HEADER标记

  • {$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_NX_COMPAT} //$0100

    该映像与数据执行保护(DEP)兼容。

  • {$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE} //$0040

    可以在加载时重定位DLL。 (又名ASLR - 地址空间布局随机化)

  • {$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE} //$8000

    The image is terminal server aware.

答案 1 :(得分:11)

请参阅此CodeCentral文章:Using more than 3 GB memory in a 32 bit Delphi program

在现代Delphi版本中,只需将编译器指令添加到dpr: {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

答案 2 :(得分:9)

请注意,编译器和RTL中存在一些假设,即指向解释为带符号的32位整数的指针永远不会为负数。例如,编译器将不允许创建大小超过2GB的数据结构,并且RTL中的某些边界检查假定例如Index + Count < 0意味着加法溢出,其中Index可能是字节数组的索引。其他问题可能会在内存管理器中出现。

测好并自行承担风险。

答案 3 :(得分:1)

如果这样做,请确保使用FastMM,因为它支持&gt; 2GB指针。早些时候Delphi的内存管理器不会像Barry Kelly所描述的那样运行良好。