2009-12-04 44 views
10

根據該MSDN page如何啓用我的32位Delphi應用程序以在64位窗口上使用4GB內存(通過Wow64.exe)?

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位應用程序 都將在WOW64環境中接收2 GB的虛擬地址空間 。

如何有效地設置IMAGE_FILE_LARGE_ADDRESS_AWARE國旗在我的2007年德爾福的應用程序,這樣我可以讓我的32位應用程序WOW64 知道並解決內存高達一個完整的4GB?

回答

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.

8

注意,有烤到編譯器和RTL假設指針,解釋爲符號的32位整數,將永遠不要消極。例如,編譯器不允許創建大於2GB的數據結構,並且RTL中的某些邊界檢查假定例如Index + Count < 0表示加法溢出,其中Index可能是一個字節數組的索引。內存管理器中可能會出現其他問題。

測試一切並自行承擔風險。

+0

解決RTL/VCL中這些問題的機會是否存在? :) – Alex 2010-04-30 08:58:20

+0

爲什麼指針應該被解釋爲有符號的32位整數?這聽起來像是Embarcadero應該修復的一個有缺陷的設計,特別是因爲你似乎並不急於發佈64位版本的Delphi。 – 2010-07-29 11:59:24

+3

@Jan Goyvaerts - 簡單,方便,高效地檢測溢出,就像我描述的那樣。而圍繞64位等的市場營銷和產品決策與我在此發佈的特定技術警告完全無關。 – 2010-07-31 22:02:57

1

如果你這樣做,一定要使用FastMM,因爲它支持> 2GB的指針。早期的德爾福內存管理器不能像Barry Kelly所描述的那樣工作。

相關問題