F
@WebFritzi:
Ok. Ich brauche das Proggie für Win2000/XP. Ich habe mal Deinen Vorschlag mit eingearbeitet. Soweit funktioniert das jetzt alles. Danke nochmal!
Ich habe jetzt mal in der MSDN nachgeschaut, das steht noch so einiges interessantes drin ...
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <windows.h>
#include <tlhelp32.h>
#include <Psapi.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
typedef BOOL (WINAPI *TH32_PROCESS)(HANDLE hSnapShot, LPPROCESSENTRY32 lppe);
typedef BOOL (WINAPI *LPPMI) (HANDLE, PPROCESS_MEMORY_COUNTERS, DWORD);
static TH32_PROCESS pProcess32First = NULL;
static TH32_PROCESS pProcess32Next = NULL;
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnStartClick(TObject *Sender)
{
HANDLE hSnapShot;
HANDLE hProcess;
PROCESSENTRY32 ProcEntry = {0};
ProcEntry.dwSize = sizeof (PROCESSENTRY32);
PROCESS_MEMORY_COUNTERS pmc;
pmc.cb = sizeof(PROCESS_MEMORY_COUNTERS);
LPPMI GetProcessMemoryInfo;
MEMORYSTATUSEX statex;
statex.dwLength = sizeof (statex);
TTreeNode *Node;
TFileTime CreationTime;
TFileTime ExitTime;
TFileTime KernelTime;
TFileTime UserTime;
TDateTime dtTempTime;
AnsiString sPriority;
int iThreadCnt;
// System-DLLs für die benötigten Funktionen laden
HINSTANCE hDll = LoadLibrary("kernel32.dll");
HINSTANCE hPMDll = LoadLibrary("PSAPI.DLL");
try
{
if (hDll && hPMDll)
{
// Adressen der benötigten DLL-Funktionen ermitteln
pProcess32First = (TH32_PROCESS)GetProcAddress(hDll, "Process32First");
pProcess32Next = (TH32_PROCESS)GetProcAddress(hDll, "Process32Next");
GetProcessMemoryInfo = (LPPMI)GetProcAddress(hPMDll, "GetProcessMemoryInfo");
if (pProcess32First && pProcess32Next && GetProcessMemoryInfo)
{
// Treeview mit Daten füllen
TreeView1->Items->BeginUpdate();
TreeView1->Items->Clear();
TreeView1->Items->Add(NULL, "Processes");
// Snapshot erstellen
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if ((hSnapShot == 0) || (hSnapShot == INVALID_HANDLE_VALUE)) ShowMessage("ERROR: CreateToolhelp32Snapshot");
else
{
// 1. Prozess ermitteln
if (!(pProcess32First (hSnapShot, &ProcEntry))) ShowMessage("ERROR: Process32First");
else
{
// Prozessliste solange durchsuchen, bis der letzt erreicht ist
do
{
Node = TreeView1->Items->GetFirstNode();
Node = TreeView1->Items->AddChild(Node, "("+IntToStr(ProcEntry.th32ProcessID)+") "+ExtractFileName(ProcEntry.szExeFile));
// Handle auf den jeweiligen Prozess holen
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, ProcEntry.th32ProcessID);
if (hProcess != 0)
{
// Prozess-Zeiten ermitteln
if (!GetProcessTimes(hProcess, &CreationTime, &ExitTime, &KernelTime, &UserTime)) ShowMessage("ERROR: GetProcessTimes (Node: "+Node->Text+")");
else
{
// Prozess-Priority holen
switch (GetPriorityClass(hProcess))
{
case HIGH_PRIORITY_CLASS : sPriority = "high"; break;
case IDLE_PRIORITY_CLASS : sPriority = "idle"; break;
case NORMAL_PRIORITY_CLASS : sPriority = "normal"; break;
case REALTIME_PRIORITY_CLASS : sPriority = "realtime"; break;
}
// Memoryinfo für Prozess holen
GetProcessMemoryInfo(hProcess, &pmc, pmc.cb);
// Filetime (64Bit) in TDateTime umrechnen
FileTime2DateTime(&CreationTime, &dtTempTime);
// Daten in den Tree eintragen
TreeView1->Items->AddChild(Node, "CreationTime: "+dtTempTime.DateString()+" : "+dtTempTime.TimeString());
FileTime2DateTime(&ExitTime, &dtTempTime);
TreeView1->Items->AddChild(Node, "ExitTime: "+dtTempTime.DateString()+" : "+dtTempTime.TimeString());
FileTime2DateTime(&KernelTime, &dtTempTime);
TreeView1->Items->AddChild(Node, "KernelTime: "+dtTempTime.DateString()+" : "+dtTempTime.TimeString());
FileTime2DateTime(&UserTime, &dtTempTime);
TreeView1->Items->AddChild(Node, "UserTime: "+dtTempTime.DateString()+" : "+dtTempTime.TimeString());
iThreadCnt = ProcEntry.cntThreads;
TreeView1->Items->AddChild(Node, "Threads: "+IntToStr(iThreadCnt));
TreeView1->Items->AddChild(Node, "Priority: "+sPriority);
TreeView1->Items->AddChild(Node, "Memory: "+IntToStr((int)pmc.WorkingSetSize)+" bytes");
}
CloseHandle(hProcess);
}
}
while (pProcess32Next (hSnapShot, &ProcEntry));
// Zum Schluss noch den Speicherstatus holen und in das Memo einfügen
GlobalMemoryStatusEx(&statex);
Memo1->Clear();
Memo1->Lines->Add("Memusage: "+IntToStr(statex.dwMemoryLoad)+"%");
Memo1->Lines->Add("phys. Mem: "+IntToStr((__int64)statex.ullTotalPhys)+" bytes");
Memo1->Lines->Add("avail. Mem: "+IntToStr((__int64)statex.ullAvailPhys)+" bytes");
Memo1->Lines->Add("total Page Mem: "+IntToStr((__int64)statex.ullTotalPhys)+" bytes");
Memo1->Lines->Add("avail Page Mem: "+IntToStr((__int64)statex.ullAvailPageFile)+" bytes");
Memo1->Lines->Add("total virtual Mem: "+IntToStr((__int64)statex.ullTotalVirtual)+" bytes");
Memo1->Lines->Add("avail virtual Mem: "+IntToStr((__int64)statex.ullAvailVirtual)+" bytes");
Memo1->Lines->Add("avail extended virtual Mem: "+IntToStr((__int64)statex.ullAvailExtendedVirtual)+" bytes");
CloseHandle(hSnapShot);
}
}
}
}
else ShowMessage("ERROR: kernel32.dll or PSAPI.DLL not found.");
}
__finally
{
TreeView1->Items->EndUpdate();
// DLLs entladen
if (hDll) FreeLibrary (hDll);
if (hPMDll) FreeLibrary (hPMDll);
}
}
//---------------------------------------------------------------------------
// Funktion zum umrechnen von FileTime (64Bit) in TDateTime
void __fastcall TfrmMain::FileTime2DateTime(LPFILETIME lpFileTime, TDateTime* DateTime)
{
//** DEC VAR
SYSTEMTIME SystemTime;
//** FileTime ==> SystemTime
FileTimeToSystemTime(lpFileTime,&SystemTime);
//** SystemTime ==> DateTime
*DateTime = SystemTimeToDateTime(SystemTime);
}