Delphi调用GlobalMemoryStatus获取内存信息

下面介绍一种方法可以获取系统内存的多少、使用状态等信息。更重要的是,应用程序可以利用这项技术来决定客户机的可用内存的大小,利用这些信息,应用程序可以动态地优化程序的性能。例如,如果有足够的内存可以利用双缓存优化位图的操作。利用Windows API函数GlobalMemoryStatus可以完成上述功能。

GlobalMemoryStatus接收一个类型为TMemoryStatus的变参,通过这个参数就可以获得Windows当前的内存状态。TMemoryStatus的结构如下:

1
2
3
4
5
6
7
8
9
10
11
PMemoryStatus = ^TMemoryStatus;
_MEMORYSTATUS = record
dwLength DWORD; { sizeof(MEMORYSTATUS),该记录结构的大小}
dwMemoryLoad DWORD; {使用内存所占百分比}
dwTotalPhys DWORD; {全部物理内存字节数}
dwAvailPhys DWORD; { 可用物理内存字节数}
dwTotalPageFile DWORD; { 全部页文件字节数 }
dwAvailPageFile DWORD; { 可用页文件字节数 }
dwTotalVirtual DWORD; { 全部虚拟内存字节数}
dwAvailVirtual DWORD; { 可用虚拟内存字节数}
end;

调用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.btn1Click(Sender: TObject);
var
memoinfo : TMemoryStatus;
begin
GlobalMemoryStatus(memoinfo);
with mmo1.Lines do
begin
Add(Format('Length:' + #9#9 + '%d' + ' Bytes',[memoinfo.dwLength]));
Add(Format('MemoryLoad:' + #9 + '%d' ,[memoinfo.dwMemoryLoad]));
Add(Format('TotalPhys:' + #9 + '%d' + ' Bytes',[memoinfo.dwTotalPhys]));
Add(Format('AvailPhys:' + #9 + '%d' + ' Bytes',[memoinfo.dwAvailPhys]));
Add(Format('TotalPageFile:' + #9 + '%d' + ' Bytes',[memoinfo.dwTotalPageFile]));
Add(Format('AvailPageFile:' + #9 + '%d' + ' Bytes',[memoinfo.dwAvailPageFile]));
Add(Format('TotalVirtual:' + #9 + '%d' + ' Bytes',[memoinfo.dwTotalVirtual]));
Add(Format('AvailVirtual:' + #9 + '%d' + ' Bytes',[memoinfo.dwAvailVirtual]));
end;
end;

上面这个方法一般情况下针对一根内存条获取的信息是正常的(win7 64bit/XP+delphi7)下测试正常,但是如果一台电脑里面有两根或以上内存的话,那就只能取出一根内存的信息出来,所以我们只好调用GlobalMemoryStatusEx这个API来实现了.

函数定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
type
DWORDLONG = UInt64;

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

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

调用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.btn1Click(Sender: TObject);
var
memoinfo : TMemoryStatus;
begin
GlobalMemoryStatus(memoinfo);
with mmo1.Lines do
begin
Add(Format('Length:' + #9#9 + '%d' + ' Bytes',[memoinfo.dwLength]));
Add(Format('MemoryLoad:' + #9 + '%d' ,[memoinfo.dwMemoryLoad]));
Add(Format('TotalPhys:' + #9 + '%d' + ' Bytes',[memoinfo.ulTotalPhys]));
Add(Format('AvailPhys:' + #9 + '%d' + ' Bytes',[memoinfo.ulAvailPhys]));
Add(Format('TotalPageFile:' + #9 + '%d' + ' Bytes',[memoinfo.ulTotalPageFile]));
Add(Format('AvailPageFile:' + #9 + '%d' + ' Bytes',[memoinfo.ulAvailPageFile]));
Add(Format('TotalVirtual:' + #9 + '%d' + ' Bytes',[memoinfo.ulTotalVirtual]));
Add(Format('AvailVirtual:' + #9 + '%d' + ' Bytes',[memoinfo.ulAvailVirtual]));
end;
end;