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