Einzelnen Beitrag anzeigen

Leon421

Registriert seit: 18. Feb 2010
2 Beiträge
 
Delphi 6 Personal
 
#1

Prozesse & Handles auslesen

  Alt 18. Feb 2010, 13:27
Hi, ich bin auf meiner Suche nach Möglichkeiten, mit Delphi laufende Prozesse auszulesen, auf dieses Forum gestoßen, und habe mehrere Implementationen gefunden.
Alle funktionieren mehr oder weniger gut, die folgende funktioniert in sofern am besten, dass sie öfter als nicht nur die Nutzerprozesse "sieht", und ohne weiteres Filtern eine ziemlich "saubere" Liste liefert.

Versuche ich jedoch, an den Handle heranzukommen (entweder direkt über ProzessHandle, oder über die eingefügte Funktion GetProcessHandleFromID) passiert etwas absonderliches.
Ich erhalte für jede ID das gleiche Handle. Entferne ich eine der fettgedruckten "Closehandle()" zeilen, so erhalte ich für jeden Prozess eine einzigartigen Handle, jedoch scheinen diese Handles zerstört zu werden, da bei der nächsten Iteration alle Handles größer sind als vorher.

Ich bin zwar neu hier, wäre aber trotzdem ausgesprochen dankbar, falls mir Jemand helfen könnte.


Hier ist der Quelltext, mehrere Varianten waren diesem sehr ähnlich. Ich weiss leider nicht mehr, wer der Author dieser Implementation ist.

Code:
procedure DoStuff;

    function GetProcessHandleFromID(ID: DWORD): THandle;
    begin
      result := OpenProcess(SYNCHRONIZE, False, ID);
      [b]CloseHandle(result);[/b]
    end;

    var PrIDs : array [0..1000] of DWORD;
        PrName : array [0..255] of Char;
        Bia : DWORD;
        i, PrCount : Integer;
        ProzessHandle : HWND;
        Modulhandle : HWND;
    begin
    PList:=TStringList.Create;
    HList:=TStringList.Create;
    if EnumProcesses(@PrIDs, SizeOf(PrIDs), bia) then begin
       if (Bia < sizeof(PrIDs)) then begin
          PrCount:=Bia div SizeOf(DWORD);
          for i:=0 to PrCount do begin
              ProzessHandle:=OpenProcess(PROCESS_QUERY_INFORMATION or
                                         PROCESS_VM_READ, False, PrIDs[i]);
              if (ProzessHandle <> 0) then begin
                 EnumProcessModules(ProzessHandle,
                                    @ModulHandle,
                                    SizeOf(modulhandle),
                                    Bia);
                 GetModuleFilenameEx(Prozesshandle,
                                     ModulHandle,
                                     PrName,
                                     SizeOf(PrName));
                 PList.Add(ExtractFileName(PrName));
                 HList.Add(IntToStr(GetProcesshandleFromID(PrIDs[i])));

                [b] CloseHandle(ProzessHandle);[/b]
              end;
          end; {for i}
       end else begin
          MessageDlg('PrID-Array zu klein', mtError, [mbOk], 0)
       end;
    end else begin
       RaiseLastOSError();
    end;
   end;
  Mit Zitat antworten Zitat