おかげで、私は次のDelphiの関数を記述することができました:
Type
TMemoryStatusEx = packed record
dwLength: DWORD;
dwMemoryLoad: DWORD;
ullTotalPhys: Int64;
ullAvailPhys: Int64;
ullTotalPageFile: Int64;
ullAvailPageFile: Int64;
ullTotalVirtual: Int64;
ullAvailVirtual: Int64;
ullAvailExtendedVirtual: Int64;
end;
TGlobalMemoryStatusEx = function(var MSE: TMemoryStatusEx): LongBool; stdcall;
function VirtualSizeUsage: Int64;
var MSE: TMemoryStatusEx;
fnGlobalMemoryStatusEx: TGlobalMemoryStatusEx;
begin
Result := 0;
@fnGlobalMemoryStatusEx := GetProcAddress(GetModuleHandle(kernel32), 'GlobalMemoryStatusEx');
if Assigned(@fnGlobalMemoryStatusEx) then
begin
MSE.dwLength := SizeOf(MSE);
if fnGlobalMemoryStatusEx(MSE) then
Result := MSE.ullTotalVirtual-MSE.ullAvailVirtual;
end;
end;
それは私のために素晴らしい作品のようです(デルファイ6 、Win XP)。 GlobalMemoryStatusExの代わりにGlobalMemoryStatusを使用すると簡単な解決策があるかもしれませんが、メモリが2GBを超えるシステムでは正しく動作しません。
64ビットWindowsでは、LARGEADDRESSAWAREを使用すると、32ビットプロセスで4GBの仮想アドレス空間を使用できます。 D6では、Borland MMのバグのためにMMを(たとえばFastMMに)切り替える必要があります。 –