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

Mic*_*ick 12 delphi 64-bit 32-bit

根据这个MSDN页面:

WOW64使32位应用程序能够利用64位内核.因此,32位应用程序可以使用更多的内核句柄和窗口句柄.但是,32位应用程序可能无法在WOW64下创建与在基于x86的系统上本机运行时一样多的线程,因为WOW64为每个线程分配了额外的64位堆栈(通常为512 KB).此外,为WOW64本身及其使用的数据结构保留了一定量的地址空间.保留金额取决于处理器; Intel Itanium上保留的内容多于x64处理器上的内容.

如果应用程序在映像头中设置了IMAGE_FILE_LARGE_ADDRESS_AWARE标志,则每个32位应用程序在WOW64环境中都会收到4 GB的虚拟地址空间.如果未设置IMAGE_FILE_LARGE_ADDRESS_AWARE标志,则每个32位应用程序在WOW64环境中接收2 GB的虚拟地址空间.

如何有效地设置IMAGE_FILE_LARGE_ADDRESS_AWARE国旗在我的2007年德尔福的应用程序,这样我可以让我的32位应用程序WOW64 认识和处理多达内存4GB满?

gab*_*abr 12

请参阅CodeCentral文章:在32位Delphi程序中使用3 GB以上的内存.

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


Ken*_*ite 12

使用链接器指令$ SetPEFlags:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
Run Code Online (Sandbox Code Playgroud)

IMAGE_FILE_LARGE_ADDRESS_AWARE常数以Windows.pas定义.我不记得哪个Delphi版本首先包含它.

在Delphi 2007中,您将找到"PE(可移植可执行文件)标头标志(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

    图像是终端服务器识别的.


Bar*_*lly 9

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

测试好并自担风险.

  • @Jan Goyvaerts - 简单,轻松,高效地检测溢出,就像我描述的那样.围绕64位等的营销和产品决策与我在此发布的具体技术警告完全无关. (3认同)