Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使32位Delphi应用程序在64位windows上使用4gb内存(通过Wow64.exe)?_Delphi_64 Bit_32 Bit - Fatal编程技术网

如何使32位Delphi应用程序在64位windows上使用4gb内存(通过Wow64.exe)?

如何使32位Delphi应用程序在64位windows上使用4gb内存(通过Wow64.exe)?,delphi,64-bit,32-bit,Delphi,64 Bit,32 Bit,据此: WOW64使32位应用程序能够 利用64位内核。 因此,32位应用程序可以使用 大量内核句柄和 窗口句柄。但是,32位 应用程序可能无法创建 WOW64下的线程数与它们的线程数相同 在基于x86的系统上本机运行时可以 系统,因为WOW64分配 额外的64位堆栈(通常为512位) KB)用于每个线程。此外,一些 保留的地址空间量 对于WOW64本身和数据 它使用的结构。金额 保留取决于处理器; 英特尔安腾上保留了更多信息 而不是在x64处理器上 如果应用程序具有 图像\u文件\u大\u地址

据此:

WOW64使32位应用程序能够 利用64位内核。 因此,32位应用程序可以使用 大量内核句柄和 窗口句柄。但是,32位 应用程序可能无法创建 WOW64下的线程数与它们的线程数相同 在基于x86的系统上本机运行时可以 系统,因为WOW64分配 额外的64位堆栈(通常为512位) KB)用于每个线程。此外,一些 保留的地址空间量 对于WOW64本身和数据 它使用的结构。金额 保留取决于处理器; 英特尔安腾上保留了更多信息 而不是在x64处理器上

如果应用程序具有 图像\u文件\u大\u地址\u识别标志 在图像标题中设置,每个32位 应用程序接收4 GB的虚拟内存 WOW64中的地址空间 环境如果 图像\u文件\u大\u地址\u感知标志为 未设置,每个32位应用程序 接收2 GB的虚拟地址空间 在WOW64环境中


如何在我的Delphi 2007应用程序中有效地设置IMAGE\u FILE\u LARGE\u ADDRESS\u AWARE标志,以便使我的32位应用程序Wow64可识别,并可寻址最多4GB的内存?

请参阅此CodeCentral文章:

在现代Delphi版本中,只需向dpr添加编译器指令:
{$SetPEFlags IMAGE\u FILE\u LARGE\u ADDRESS\u AWARE}

使用链接器指令$SetPEFlags:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
Windows.pas中定义了
IMAGE\u FILE\u LARGE\u ADDRESS\u AWARE
常量。不过,我不记得是哪个Delphi版本首先包含了它

在Delphi2007中,您会发现中记录了SetPEFlags

一些有用的标志

  • {$SetPEFlags IMAGE\u FILE\u LARGE\u ADDRESS\u AWARE}/$0020

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

  • {$SetPEFlags IMAGE\u FILE\u NET\u RUN\u FROM\u SWAP}/$0800

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

  • {$SetPEFlags IMAGE\u FILE\u REMOVABLE\u RUN\u FROM\u SWAP}/$0400

    如果映像位于可移动介质上,请将其复制到交换文件并从中运行

某些标志

  • {$SetPEOptFlags图像\u DLLCHARACTERISTICS\u NX\u COMPAT}/$0100

    映像与数据执行预防(DEP)兼容

  • {$SetPEOptFlags图像\u DLLCHARACTERISTICS\u DYNAMIC\u BASE}/$0040

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

  • {$SetPEOptFlags图像\u DLLCHARACTERISTICS\u终端\u服务器\u AWARE}/$8000


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


做好测试并自行承担风险。

如果您这样做,请确保使用FastMM,因为它支持>2GB的指针。早期的Delphi内存管理器不会像Barry Kelly已经描述的那样工作良好。

RTL/VCL中的此类问题有没有可能得到修复,如果有的话?:)为什么指针应该被解释为有符号的32位整数?“对我来说,这听起来像是一个有缺陷的设计,Embarcadero应该加以修复,尤其是在您似乎并不急于发布64位版本的Delphi时。”Jan Goyvaerts-简单、轻松、高效地检测溢出,如我所述。关于64位等的营销和产品决策与我在这里发布的具体技术警告完全无关。我不确定这对任何人都有帮助,但这个指令应该在使用WinApi.Windows之后使用;因为有些Delphi版本需要它来工作。