2013-11-04 1 views
4

델파이 2007을 사용하는 시스템의 총 실제 메모리를 가져와야합니다. 4GB 이상의 시스템에서 GlobalMemoryStatus를 사용하면 오류가 발생합니다. Delphi 2007에서는 GlobalMemoryStatusEx가 존재하지 않으므로 함수 호출을 수동으로 프로그램에 추가했습니다. 그것은 내 Windows 7 x64에서 메모리를 올바르게 반환하지만 (8GB) Vista x32 시스템에서는 여전히 잘못된 값을 반환합니다 (이 시스템에서 4GB이어야하지만 2.9GB를 반환합니다). 어떤 생각을 잘못하고있을 수 있습니까? GlobalMemoryStatusEx는 이전 운영 체제에서도 작동합니까?델파이 2007 : 총 RAM을 얻기위한 GlobalMemoryStatus

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 비트 OS에서 4GB 램을보고하지 않습니다. 여기는 "3기가바이트 -하지 - 4 기가 바이트 RAM 문제"제목의 MSDN blog article에서 인용 : 당신이 설치 실제 RAM 4GB의 경우

이 때문에 오래 전에 만들어진 건축 결정, Windows 만보고 할 수있다 의 일부 물리적 RAM 4GB ( 장치, 마더 보드의 칩셋 & BIOS에 따라 ~ 2.75GB ~ 3.5GB 범위).

GlobaMemoryStatusEx은 Windows 2000 이상에서 작동해야합니다 (최신 MSDN 문서에서는 Win2K가 제외되었지만 이전 버전에서는 그랬습니다).