Hallo zusammen,
Also ich habe mit einem Freund eine applikation geschrieben eigentlich 2. eine Java applikation welche sich in einer endlosschleife befindet bis ich sie beende. Nun habe ich sie immer mit folgender Funktion beendet:
Delphi-Quellcode:
function TForm1.TerminateProcessesByFilename(const Filename: string;
out Found, Terminated: Cardinal; UsePath: Boolean = False): Boolean;
var
Module: string;
ProcessSnapshot: THandle;
ProcessEntry32: TProcessEntry32;
ModuleSnapshot: THandle;
ModuleEntry32: TModuleEntry32;
ModuleFound: Boolean;
ProcessHandle: THandle;
begin
{Sucht einen Laufenden Prozess anhand des Exenamens. Dieser Exe name ist in unserem Fall der name
des BMServer weil dieser Prozess ansonsten eigenständig weiterleuft. Auch könnte sie bei erweiterungen
dazu benutzt werden um zum beispiel Winamp oder PowerDVD zu beenden.
Alle Prozesse die Anhand des Exe Namens gefunden werden werden Terminiert
}
Module := LowerCase(Filename);
if not UsePath then
Module := ExtractFileName(Filename);
Result := True;
Found := 0;
Terminated := 0;
ProcessSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (ProcessSnapshot <> 0) and
(ProcessSnapshot <> INVALID_HANDLE_VALUE) then
try
FillChar(ProcessEntry32, SizeOf(TProcessEntry32), 0);
ProcessEntry32.dwSize := SizeOf(TProcessEntry32);
if Process32First(ProcessSnapshot, ProcessEntry32) then
repeat
ModuleSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,
ProcessEntry32.th32ProcessID);
if (ModuleSnapshot <> INVALID_HANDLE_VALUE) then
try
FillChar(ModuleEntry32, SizeOf(TModuleEntry32), 0);
ModuleEntry32.dwSize := SizeOf(TModuleEntry32);
if Module32First(ModuleSnapshot, ModuleEntry32) then
begin
if UsePath then
ModuleFound := (LowerCase(ModuleEntry32.szExePath) = Module)
else
ModuleFound := (LowerCase(ModuleEntry32.szModule) = Module);
if ModuleFound then
begin
Inc(Found);
// Öffnen des Prozesses
ProcessHandle := OpenProcess(PROCESS_TERMINATE, False,
ProcessEntry32.th32ProcessID);
if (ProcessHandle <> 0) then
try
// Beenden des Prozesses
if TerminateProcess(ProcessHandle, 0) then
Inc(Terminated)
else
Result := False;
finally
CloseHandle(ProcessHandle);
end
else
Result := False;
end;
end;
finally
CloseHandle(ModuleSnapshot);
end;
until not Process32Next(ProcessSnapshot, ProcessEntry32);
finally
CloseHandle(ProcessSnapshot);
end;
end;
Nun ist aber das Problem das die beendete applikation wenn ich sie so beende nicht mehr funktioniert. Wenn ich aber diese applikation nicht mit meiner software beende sondern einfach aleinstehend betreibe und anschliessend über das kreuz oder mit alt+f4 beende geht das.
Also dacht ich mir sendest dem Prozess einfach alt+f4 und fertig is ^^' aber nix war mit fertig der prozess wurde dann einfach nicht mehr beendet.
Kennt jemand eine Möglichkeit "normal" zu sagen das er beendet wurde ohne ihn gleich abzuschiessen ?
lg Sev
Anmerkung: das Programm wird bei mir in der Applikation in einer Konsole gestartet und dort betrieben schliesse ich die konsole bleibt der Prozess bestehen und ich muss den Prozess manuell beenden.