![]() |
In welchem Pfad läuft ein Prozess?
Hallo zusammen,
gibt es keine Möglichkeit, auf einfache weise, folgendes herauszufinden: ist eine Exe gestartet? (ich weiß nicht, ob die immer ein Window-Handle hat). Wenn ja, in welchem Pfad liegt sie? Ich will eigentlich nicht erst noch groß ToolHelp oder sonstwas installieren, das muß doch auch mit Bordmitteln gehen? Ich will auch nix ändern sondern nur wissen, ob mein Screenreader (jfw.exe) läuft und wenn ja, in welchem Verzeichnis sie liegt. Ich bräuchte mal 'n tip, bitte! Herzliche Grüße Marco |
AW: In welchem Pfad läuft ein Prozess?
Das wäre ein Anfang:
![]() |
AW: In welchem Pfad läuft ein Prozess?
Ich verwende für sowas gerne die madCollection. Damit lässt sich das ganz einfach ermitteln:
![]()
Delphi-Quellcode:
// Example:
Process('explorer.exe').ExeFile -> 'C:\Windows\Explorer.exe' |
AW: In welchem Pfad läuft ein Prozess?
Mit folgender funktion hast Du 2 Ergebnisse auf einmal, wenn TRUE dann ist es im selben Verzeichnis gestartet, wenn Count > 0 dann kannst Du alle geladenen Prozesse mit gleichen Dateinamem abrufen.
Sorry aber ein paar uses braucht man schon dafür.
Delphi-Quellcode:
/edit
uses TlHelp32, PsAPI;
{* * Procedure : KillProcess * Author : Michael Puff * Date : 2006-09-15 * Terminates a process identified by its PID *} function KillProcess(dwProcID, Wait: DWORD): Integer; var hProcess : Cardinal; dw : DWORD; begin // open the process and store the process-handle hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, dwProcID); // kill it if hProcess <> 0 then begin dw := Integer(TerminateProcess(hProcess, 1)); if dw <> 0 then begin // TerminateProcess returns immediately, so we have to verify the result via // WaitForSingleObject dw := WaitForSingleObject(hProcess, Wait); if dw = WAIT_FAILED then dw := GetLastError; end else // TerminateProcess = 0 dw := GetLastError; CloseHandle(hProcess); end else // hProcess = INVALID_HANDLE_VALUE dw := GetLastError; result := dw; end; function ProcessExists(const AFileName: string; var FoundFiles: TStringList; const IncludeHost: Boolean = False; const Kill: Boolean = False): Boolean; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; fullPath: string; myHandle: THandle; myPID: DWORD; OwnPID: Cardinal; begin FoundFiles := TStringList.Create; OwnPID := GetCurrentProcessId; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); Result := False; while Integer(ContinueLoop) <> 0 do begin if UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExtractFileName(AFileName)) then begin myPID := FProcessEntry32.th32ProcessID; if (Kill = True) then if (OwnPID <> myPID) then KillProcess(myPID, 500); // Wenn Du hier noch eine Null ranhängst, gibst Du der Kill Funktion 5 Sekunden Zeit zum Abschluss zu kommen myHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, myPID); if myHandle <> 0 then try SetLength(fullPath, MAX_PATH); if GetModuleFileNameEx(myHandle, 0, PChar(fullPath), MAX_PATH) > 0 then begin SetLength(fullPath, StrLen(PChar(fullPath))); if UpperCase(ExtractFilename(fullPath)) = UpperCase(ExtractFilename(AFileName)) then if (IncludeHost=False) then begin if (OwnPID <> myPID) then FoundFiles.Add(fullPath); end else FoundFiles.Add(fullPath); if UpperCase(fullPath) = UpperCase(AFileName) then Result := True; end else fullPath := ''; finally CloseHandle(myHandle); end; {if Result then Break;} end; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; procedure TForm1.Button1Click(Sender: TObject); var s: TStringList; i: Integer; begin Memo1.Clear; processExists(Application.ExeName,S, Checkbox1.Checked, Checkbox2.Checked); for i := 0 to S.Count -1 do Memo1.Lines.Add(S.Strings[i]); end; nun ist noch eine Abfrage enthalten ob der Host-Prozess berücksichtigt werden soll, nur bei TRUE ist der in der Liste enthalten. /edit nun kann es alle "nicht-Hosts" auch killen :-) |
AW: In welchem Pfad läuft ein Prozess?
Zitat:
An TE: Vielleicht wäre es auch besser eine "OnlyOneInstance" funktionalität Deinem Programm beizubringen? Das würde jedenfalls diese Prozess Suche abkürzen und eher zutreffend sein. Vielleicht mit einem MUTEX in .DPR? Je nach dem was man erreichen will. Inhaltlich hast Du auf jedenfall zwei gute Lösungen die Dir alle Prozesse mit gewünschtem Dateinamen auflisten könnten. |
AW: In welchem Pfad läuft ein Prozess?
Zitat:
![]() Das Geld ist aber definitiv gut angelegt. |
AW: In welchem Pfad läuft ein Prozess?
Klein würde ich den Obolus nicht nennen.
Die Mehrwertsteuer kommt noch oben drauf. Die 159€ die da stehen sind nur zum anlocken da. |
AW: In welchem Pfad läuft ein Prozess?
LOL madExcept 4.0.20, nein das wollte ich nicht kaufen (ich bin bei der Konkurenz seit Jahren, vielleicht haben die ja was ähnliches, so intern habe ich mich damit noch nicht viel beschäftigt, EurekaLog ist verbaut in Version 7, seit dem hat CRC ne macke, na egal, alles wird gut^^)
für Interessierte, ich habe da oben noch ne Host-Prozess ability eingepflanzt damit eben dieser nicht in der Liste erscheint, ich weiß ja noch nicht was der TE mit dieser Information anfängt (eine Dateiliste zu einem Dateinamen) |
AW: In welchem Pfad läuft ein Prozess?
Ebenfalls von Moderator Luckie dieses
![]() Oben wäre nun auch eine TerminateProcess funktion enthalten :-) |
AW: In welchem Pfad läuft ein Prozess?
Da gräbt jetzt aber einer in meiner dunklen Vergangenheit. :mrgreen:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz