Autor Beitrag
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Mo 12.05.08 20:28 
Moin,

ich habe schon viel dazu gelesen, allerdings funktioniert das nicht, was ich glesen habe. Ich liste mal auf, was ich schon habe:
ausblenden 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:
ausblenden 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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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:

ausblenden 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);

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Regan Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: 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:
ausblenden volle Höhe 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;