![]() |
Einen Prozess "anständig" beenden.
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:
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.
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; 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. |
Re: Einen Prozess "anständig" beenden.
Bau doch etwas ein, dass du die Andere APP beenden kannst. eine Message, die du schickst, ein MMF, dass du veränderst, sockets....
|
Re: Einen Prozess "anständig" beenden.
Joa dacht ich auch schon daran aber was ist ein MMF ? das blöde ist die andere Applikation ist ne Java applikation und die höhrt die ganze zeit den Bluetooth Stack ab und gibt die Empfangenen Daten meiner Applikation über den Konsolenoutput weiter...
|
Re: Einen Prozess "anständig" beenden.
MMF = Memory Mapped File
Sind hier im Forum viele Infos und auch Beispiele zu zu finden |
Re: Einen Prozess "anständig" beenden.
Musst ja nicht MMF nehmen. Wahrscheinlich geht auch ein GlobalAtom... Was halt Java so hergibt. Da fehlen mir die Erfahrungen.
|
Re: Einen Prozess "anständig" beenden.
joa das ist auch mein problem. Java gibt da fast nix her da es inner sandbox leuft. Es ist schon verdammt schwer handels auszulesen mit java. oder Tastenevents direkt an ein handle resp. programm zu senden.
aber meine frage war das geht von aussen nicht direkt da muss ich in der Java applikation drauf reagieren ? weil das wollte ich eben wenn möglich verhindern... Java ist auch nicht so mein ding. hätte das teil einen destructor hätte ich einige probleme nicht -.-' |
Re: Einen Prozess "anständig" beenden.
Von aussen kannst du nur mit TerminateProcess sicher beenden.
Das Senden einer WM_close Message o.ä. funktioniert macnhmal, aber auch nur, wenn die Programm darauf reagieren. Und wenn deins in einer Endlosschleife hängt, sieht es schlecht aus. |
Re: Einen Prozess "anständig" beenden.
schade aber auch :-/ danke jedenfalls werde mich mal noch auf der Java seite schlau machen... wie würde ich den ein VM_Close senden ? ganz normales postmessage ?
|
Re: Einen Prozess "anständig" beenden.
Zitat:
|
Re: Einen Prozess "anständig" beenden.
wir testen gerade die wm_close methode ^-^' wenn das geht lieb ich euch alle ^^ entlich kein windows an und abmelden mehr... und ansonsten muss ich mich halt mit mmf und globelatom auseinandersetzen wobei ich lieber mmf benützen würde...
lg sev |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:25 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 by Thomas Breitkreuz