Entwickler-Ecke

Windows API - Speicherbedarf einer Anwendung


Regan - Mo 12.05.08 20:28
Titel: Speicherbedarf einer Anwendung
Moin,

ich habe schon viel dazu gelesen, allerdings funktioniert das nicht, was ich glesen habe. Ich liste mal auf, was ich schon habe:

Von Luckie: ProcessID herausbekommen
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
function GetProcessID(Exename: string): DWORD;
var
  hProcSnap: THandle;
  pe32: TProcessEntry32;
begin
  result := 0;
  hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  if hProcSnap <> INVALID_HANDLE_VALUE then
  begin
    pe32.dwSize := SizeOf(ProcessEntry32);
    if Process32First(hProcSnap, pe32) = true then
    begin
      while Process32Next(hProcSnap, pe32) = true do
      begin
        if pos(Exename, pe32.szExeFile) <> 0 then
          result := pe32.th32ProcessID;
      end;
    end;
    CloseHandle(hProcSnap);
  end;
end;

Dann:

Von Luckie: Handle von der ProzessID
1:
2:
3:
4:
5:
function GetProcessHandleFromID(ID: DWORD): THandle;
begin
  result := OpenProcess(SYNCHRONIZE, False, ID);
  CloseHandle(result);
end;

Und zu guter letzt, leicht modifiziert von hier [http://www.swissdelphicenter.ch/de/showcode.php?id=2276]:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
function GetProcessMemorySize(Process:Cardinal; out MemSize: Cardinal): Boolean;
var
  l_nProcID, l_nTmpHandle: HWND;
  l_pPMC: PPROCESS_MEMORY_COUNTERS;
  l_pPMCSize: Cardinal;
begin
  if Process = 0 then
  begin
    Result := False;
    Exit;
  end;

  l_pPMCSize := SizeOf(PROCESS_MEMORY_COUNTERS);

  GetMem(l_pPMC, l_pPMCSize);
  l_pPMC^.cb := l_pPMCSize;

  GetWindowThreadProcessId(Process, @l_nProcID);
  l_nTmpHandle := OpenProcess(PROCESS_ALL_ACCESS, False, l_nProcID);

  if (GetProcessMemoryInfo(l_nTmpHandle, l_pPMC, l_pPMCSize)) then
    MemSize := l_pPMC^.WorkingSetSize
  else
    MemSize := 0;

  FreeMem(l_pPMC);

  Result := True;
end;

Den Aufruf hatte ich mir ungefähr so vorgestellt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function GetProzessSpeicherbedarf(FileName:String; out MemorySize:Cardinal):Boolean;
var
  hProcess:Cardinal;
begin
  result:=false;
  hProcess := GetProcessHandleFromID(GetProcessID(FileName));
  if hProcess = 0 then
    exit;
  result:= GetProcessMemorySize(hProcess,MemorySize);
end;

So. Er findet auch ein Handle, allerdings wird der Speicherbedarf nicht ausgelesen :? . Was mache ich falsch oder gibt es eine andere Möglichkeit, aus einer Anwendung (Exe oder Pfad) den Speicherbedarf herauszubekommen?

MfG
Regan


uall@ogc - Di 13.05.08 12:53

GetProcessHandleFromID ist total sinnlos, weil die nen Handle bekommt und dann direkt wieder schließt.

GetProcessMemorySize braucht als ersten Parameter ein handle des Windows, nicht das Prozesshandle, dann sollte es klappen

alternativ kannst du natürlich auch die selbe Funktion programmieren mit der ProzessID

pseudocode:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  processid := FindProcess('bla.exe');
  processhandle := openProcess(PROCESS_ALL_ACCESS, processid);
  alloc(l_pPMC);

  if (GetProcessMemoryInfo(processhandle, l_pPMC, l_pPMCSize)) then
     MemSize := l_pPMC^.WorkingSetSize;

  CloseHandle(processhandle);


Regan - Di 13.05.08 20:00

Vielen Dank für deine Antwort user profile iconuall@ogc. Das funktioniert sehr gut. Ich poste hier nochmal meinen Quellcode:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
function GetProcessMemoryInfoFromProcessName(ProcessName:String; out MemorySize:Cardinal):Boolean;
var
  hProcess:Cardinal;
  //ProzessID:  (Luckie)
  function GetProcessID(Exename: string): DWORD;
  var
    hProcSnap: THandle;
    pe32: TProcessEntry32;
  begin
    result := 0;
    hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
    if hProcSnap <> INVALID_HANDLE_VALUE then
    begin
      pe32.dwSize := SizeOf(ProcessEntry32);
      if Process32First(hProcSnap, pe32) = true then
      begin
        while Process32Next(hProcSnap, pe32) = true do
        begin
          if pos(Exename, pe32.szExeFile) <> 0 then
            result := pe32.th32ProcessID;
        end;
      end;
      CloseHandle(hProcSnap);
    end;
  end;
  //MemorySize, modifiziert von http://www.swissdelphicenter.ch/de/showcode.php?id=2276
  function GetProcessMemorySize(Process:Cardinal; out MemSize: Cardinal): Boolean;
  var
    l_pPMC: PPROCESS_MEMORY_COUNTERS;
    l_pPMCSize: Cardinal;
  begin
    if Process = 0 then
    begin
      Result := False;
      Exit;
    end;

    l_pPMCSize := SizeOf(PROCESS_MEMORY_COUNTERS);

    GetMem(l_pPMC, l_pPMCSize);
    l_pPMC^.cb := l_pPMCSize;

    if (GetProcessMemoryInfo(Process, l_pPMC, l_pPMCSize)) then
      MemSize := l_pPMC^.WorkingSetSize
    else
      MemSize := 0;


    FreeMem(l_pPMC);

    Result := True;
end;
begin
  result:=false;
  hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION, false, GetProcessID(ProcessName));
  try
    result:=GetProcessMemorySize(hProcess,MemorySize);
  finally
    CloseHandle(hProcess);
  end;
end;