Announcement

Collapse
No announcement yet.

Pfad von anderen Programmen durch Handle oder ProzessID

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Pfad von anderen Programmen durch Handle oder ProzessID

    Hallo alle zusammen!
    <br>
    Weiß einer von Euch wie ich den Pfad und den Datei-Namen von anderen Programmen durch das Handle oder die ProzessId bekommen.
    <br>
    Rückgabewert sollte etwa so aussehen: "C:\Windows\Notepad.exe"
    <br>
    Danke an alle die Helfen wollen
    <br>

  • #2
    Hallo,

    man kann sich von Windows alle aktiven Prozesse auflisten lassen und dabei den Pfadnamen des Moduls ermitteln. Unter Windows NT 4 steht der <b>Process Status Helper</b> (PSAPI.DLL) zur Verfügung, so dass eine Anwendung die API-Funktion <b>EnumProcesses</b> aufrufen kann. Die System-DLL PSAPI.DLL wird leider nicht mit einer originalen NT-Installation ausgeliefert, sondern ist Bestandteil des Win32-SDKs. Allerdings kann die DLL von den Web-Seiten von Microsoft heruntergeladen werden. Ab Delphi 4 werden diese API-Funktionen in der Unit PSAPI deklariert, so das sie sofort aufgerufen werden dürfen:
    <pre>
    uses Psapi;
    procedure TForm1.Button2Click(Sender: TObject);
    var
    i : Integer;
    pidNeeded : DWORD;
    PIDList : array[0..1000] of Integer; // Obergrenze !!!
    PIDName : array [0..MAX_PATH - 1] of char;
    PH : THandle;
    begin
    if not Psapi.EnumProcesses(@PIDList, 1000, pidNeeded) then
    raise Exception.Create('PSAPI.DLL ist nicht vorhanden!');
    for i := 0 to (pidNeeded div sizeof (Integer)- 1) do
    begin
    PH := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
    False, PIDList[i]);
    if PH <> 0 then
    begin
    if Psapi.GetModuleBaseName(PH, 0, PIDName, Sizeof (PIDName)) > 0 then
    begin
    ListBox1.Items.Add('process : ' + PIDName);
    CloseHandle(PH);
    end;
    end;
    end;
    end;
    </pre>
    Für Windows 9x steht der Process Status Helper nicht zur Verfügung, so dass man dort auf die Funktionen aus <b>ToolHelp32</b> (Delphi-Unit tlhelp32) zurückgreifen muss:
    <pre>
    var
    Snapshot : THandle;
    Process : TProcessEntry32;
    begin
    Snapshot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if Process32First(Snapshot, Process) then begin
    repeat
    Listbox1.Items.Add(Process.szExeFile);
    until NOT Process32Next(Snapshot, Process) ;
    end;
    CloseHandle(Snapshot);
    end;
    </pre&gt

    Comment

    Working...
    X