根据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内存的问题?
答案 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
答案 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所描述的那样运行良好。