Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Einen Prozess "anständig" beenden. (https://www.delphipraxis.net/107097-einen-prozess-anstaendig-beenden.html)

gibb 22. Jan 2008 13:49


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:
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.

sirius 22. Jan 2008 14:02

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....

gibb 22. Jan 2008 14:20

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...

Codewalker 22. Jan 2008 14:31

Re: Einen Prozess "anständig" beenden.
 
MMF = Memory Mapped File

Sind hier im Forum viele Infos und auch Beispiele zu zu finden

sirius 22. Jan 2008 14:33

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.

gibb 22. Jan 2008 14:36

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 -.-'

sirius 22. Jan 2008 14:45

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.

gibb 22. Jan 2008 15:00

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 ?

sirius 22. Jan 2008 15:07

Re: Einen Prozess "anständig" beenden.
 
Zitat:

Zitat von gibb
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 ?

Ja.

gibb 22. Jan 2008 15:13

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 18:06 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz