2011-11-16 13 views
6

私はDelphiプログラムを持っていますが、このプログラムがログファイルに独自の「仮想サイズ」をどのように印刷するかを見ています。 Delphiコードを使用して「仮想サイズ」を決定するにはどうすればよいですか?デルファイを使用してプロセスの仮想サイズを決定する

「仮想サイズ」とは、Process Explorerで表示される値を意味します。この値は、通常のタスクマネージャでは表示できません。それはプログラムのメモリ使用量ではなく、アドレス空間の使用量です。 Win32では、プログラムは2 GBを超えるアドレス空間を使用できません。

PS:私はDelphi 6を使用していますが、他のバージョンのコード/情報もOKです。

+0

64ビットWindowsでは、LARGEADDRESSAWAREを使用すると、32ビットプロセスで4GBの仮想アドレス空間を使用できます。 D6では、Borland MMのバグのためにMMを(たとえばFastMMに)切り替える必要があります。 –

答えて

10

おかげで、私は次の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を超えるシステムでは正しく動作しません。

+0

+1ああはい。独自のプロセスでは、これが最善の方法です。 –

6

NtQueryInformationを呼び出すことでこれを行うことができますが、パフォーマンスデータを使用することもできます。の回答がhereです。 C/C++を使用して仮想サイズを取得する方法についてのヒントを提供します。このpost

+0

+1クイックアンサーに感謝します。私はその間にそれを行うための別の方法を見つけたので、私はそれを試していないが、それは良い解決策であるようだ。 – Name

+0

@Nameようこそこのメソッドは、外部プロセスを照会するときにのみ必要です。自分の答えに対するコメントで述べたように、自分のプロセスに関する情報を探している場合に備えて、あなたのソリューションは最高です。 –

1

また、他に優秀な人に既に依存している人にとっては、JclWin32ユニットで@Nameが間違いなく指摘している定義を見つけることができます。

実際に必要な数字は、JclSysInfoユニットの個々の機能としても表示されます。 GetTotalVirtualMemory() - GetFreeVirtualMemory()を呼び出して計算します。

+0

あなたの答えをありがとう。 – Name