2013-11-04 138 views
4

我需要得到使用Delphi 2007系統的總物理內存。在4GB或更大的系統上使用GlobalMemoryStatus似乎給我錯誤。在Delphi 2007中,GlobalMemoryStatusEx不存在,因此我手動將函數調用添加到了我的程序中。它正確地返回我的Windows 7 x64上的內存(8GB),但在Vista x32系統上它仍然返回不正確的值(在此係統上應爲4GB,但返回2.9GB)。 任何想法我可能做錯了什麼? GlobalMemoryStatusEx可以在較舊的操作系統上運行嗎?德爾福2007年:GlobalMemoryStatus得到總RAM

type 
    DWORDLONG = UInt64; 

    PMemoryStatusEx = ^TMemoryStatusEx; 
    TMemoryStatusEx = packed record 
    dwLength: DWORD; 
    dwMemoryLoad: DWORD; 
    ullTotalPhys: DWORDLONG; 
    ullAvailPhys: DWORDLONG; 
    ullTotalPageFile: DWORDLONG; 
    ullAvailPageFile: DWORDLONG; 
    ullTotalVirtual: DWORDLONG; 
    ullAvailVirtual: DWORDLONG; 
    ullAvailExtendedVirtual: DWORDLONG; 
    end; 

function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): BOOL; stdcall; external kernel32; 

function getmemorysize:word; 
var 
    memory: TMemoryStatusEx; 
begin 
    FillChar(memory, SizeOf(memory), 0); 
    memory.dwLength := SizeOf(memory); 
    GlobalMemoryStatusEx(memory); 
    result:=memory.ullTotalPhys div (1024*1024); 
end; 
+0

http://blogs.msdn.com/b/hiltonl/archive/2007/04/13/the-3gb-not-4gb-ram-problem.aspx –

+0

@SertacAkyuz這回答我的Vista問題,但你呢?知道上述代碼是否可以在Windows XP等較早的操作系統上運行?我只是有點擔心,因爲我必須手動添加GlobalMemoryStatusEx的原型。謝謝。 –

+0

Ace - 聲明可能由於IDE的Win9x支持而丟失,請不要擔心。 @Ken - 完成,謝謝。 –

回答

3

這是可以預料的,你沒有做錯任何事情。 Windows不會在32位操作系統上報告4GB RAM。下面是從MSDN blog article題爲「3GB - 不4GB內存問題」一帖:

由於不久前做出的架構決策,如果你有安裝 物理內存4GB時,Windows只能夠報告 的一部分物理4GB的RAM(範圍從〜2.75GB到3.5GB,取決於安裝的 設備,主板的芯片組& BIOS)。

GlobaMemoryStatusEx應該從Windows 2000和上工作(後來MSDN文檔排除Win2K的,但早期的了吧)。