Programımız hafızada kaç KB yer kaplıyor ?
// 16 Mayıs 2009 // Delphi, Programlama
Yazdığımız programların hafızada ne kadar yer kapladıkları bilgisini elde etmenin pek çok yolu olmasına rağmen sanırım en iyi yöntem PSAPI.DLL içindeki metodları kullanmak. Bizim sevgili Delphi’miz sağolsun bu DLL’in içindeki metodları psAPI.pas(WinNT process API Interface Unit) içinde deklere etmiş. Bizlere sadece kullanmak kalıyor. Unit’i incelediğimizde pek çok yararlı metodun tanımlı olduğunu gözlemleyebiliyoruz. Processleri listeleyenlerinden tutunda, makinanızdaki device driverları listeleyen yada programınızın gereksiz kullandığı hafıza bloklarını serbest bırakmaya yarayacak bir diğer metod olan EmptyWorkingSet‘e kadar pek çok yararlı metod mevcut.(Bknz.)
Biz bu metodlardan GetProcessMemoryInfo isimli metodu kullanacağız makalemizde. Bu metod psAPI.pas’da aşağıdaki şekilde tanımlanmıştır:
function GetProcessMemoryInfo(Process: THandle; ppsmemCounters: PPROCESS_MEMORY_COUNTERS; cb: DWORD): BOOL;
Yukarıdaki tanıma sahip olan GetProcessMemoryInfo isimli fonksiyon belirtilen process için TProcessMemoryCounters tipli record değişkeninin içini doldurmaktadır. TProcessMemoryCounters’ın tanımlanma şekline sizlerin psAPI.pas içinden bakabileceğini ümid ederek, kısa kodumuzu yazmaya başlayalım:
function MemorySize: Cardinal; var pMemCounter: TProcessMemoryCounters; begin pMemCounter.cb := SizeOf(TProcessMemoryCounters) ; if GetProcessMemoryInfo(GetCurrentProcess, @pMemCounter, SizeOf(TProcessMemoryCounters)) then Result := pMemCounter.WorkingSetSize else raise Exception.Create('Bir sorun oldu..'); end;
Yukarıdaki fonksiyon bize uygulamamızın Task Manager’da da görülebildiği gibi byte cinsinden ne kadar hafıza kullandığını gösterecektir. Sizler geri dönen değeri 1024′e bölerek KB’ı, onu da 1024′e bölerek MB’ı bulabilirsiniz. Fonksiyonumuza küçük bir demo ile hayat vererek makelemizi tamamlayalım;
// Timer1 TTimer türünde Interval 1000 procedure TForm1.Timer1Timer(Sender: TObject); begin Caption := 'Kullanılan Memory:' + FormatFloat('#,##', MemorySize / 1024) + ' KB.'; end;
Saygılar, sevgiler..
. Yine güzel bir makale paylaşım için teşekkür ederim..Benim bir sorum ılacaktı ilgili konuyla alakalı ben arkada çalışan processlara gömülü injection olmuş veya dışardan fonksiyon gönderen bir uygulama yapmak istiyorum aslında upx gibi degil örnegin explorer.exe ,smss.exe gibi processların içindeki dll dostalarını görmek yardımcı olabilirmisiniz..? İkinci olarak da arkadki processların memorylerini yakalamak..