Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ShellExecute_AndWait (https://www.delphipraxis.net/131394-shellexecute_andwait.html)

R2009 24. Mär 2009 10:35


ShellExecute_AndWait
 
Hi Alle,

wie kann ich einen Prozess, der auf diese Art und Weise gestartet wurde, wieder stoppen.
Es handelt sich um den Aufruf ( aus einem Programm heraus ) eines Java Kommandozeilentools.
Ich habe die Aufgabe bekommen eine visuelle Oberfläche darum zu bauen!
Das Batch File uploadtool etabliert eine Modemverbindung. Ich möchte diese Modemverbindung abbrechen können.
Leider hab ich keinen Zugriff auf das Java Teil!

Delphi-Quellcode:
ShellExecute_AndWait('', 'cmd.exe', '/c uploadtool.bat.....
Bitte keine Diskussion darüber ob das sinnvoll ist, ich hab mich auch schon über den
Java "Spinner" aufgeregt.

Vielen Dank im Vorraus!

rollstuhlfahrer 24. Mär 2009 12:04

Re: ShellExecute_AndWait
 
HI R2009,

da gibt es 3 Möglichlkeiten:
a) du hast den Prozessnamen, den du dann beenden kannst
b) du hast die ProzessID von dem Prozess, den du beenden willst oder
c) du hast ein Fenster, welches geschlossen werden soll.

Ich geh mal davon aus, dass das zu beendende Programm kein JAVA-Programm ist.

für a)
Delphi-Quellcode:
procedure Killprocess(Name:String);
var PEHandle,hproc:cardinal; PE:ProcessEntry32;
begin
PEHandle:=CreateTOOLHelp32Snapshot(TH32cs_Snapprocess,0);
if PEHandle<>Invalid_Handle_Value then
  begin
  PE.dwSize:=Sizeof(ProcessEntry32);
  Process32first(PEHandle,PE);
  repeat
  if Lowercase(PE.szExeFile)=Lowercase(Pchar(Name)) then
    begin
    hproc:=openprocess(Process_Terminate,false,pe.th32ProcessID);
    TerminateProcess(hproc,0);
    closehandle(hproc);
    break;
    end;
  until Process32next(PEHandle,PE)=false;
  end;
closehandle(PEHandle);
end;
für b)
Delphi-Quellcode:
procedure TerminateProcess(PID: DWORD);
var
  hproc:cardinal;
begin
  hproc:=openprocess(Process_Terminate,false,pe.th32ProcessID);
  TerminateProcess(hproc,0);
  closehandle(hproc);
end;
für c)
Delphi-Quellcode:
procedure CloseWindow(wnd: HWND);
begin
  SendMessage(wnd, WM_CLOSE, 0, 0);
end;
Hoffe mal, dass da das entsprechend richtige dabei ist.

Bernhard

R2009 24. Mär 2009 12:46

Re: ShellExecute_AndWait
 
Hi,

du liegst falsch! Es ist eine Java Programm aufgerufen durch den Batch!
(Hab selten so einen Murks gesehen. Ist aber so)

Hab versucht die cmd.exe (ich kenne momentan nur den Namen des Prozesses) abzuschiessen! Lässt sich aber nicht schliessen.
Viele Grüsse

mjustin 24. Mär 2009 13:04

Re: ShellExecute_AndWait
 
Zitat:

Zitat von R2009

Delphi-Quellcode:
ShellExecute_AndWait('', 'cmd.exe', '/c uploadtool.bat.....

Wenn das Fenster einen eindeutigen Titel hat, geht es mit kill.exe (aus dem Windows NT Ressource Kit) - so schliesse ich Java-Programme, die z.B. nachts wegen einer Datensicherung vorübergehend nicht laufen dürfen. - Das ist wirklich nicht die eleganteste & professionellste aller Möglichkeiten, aber da der Prozess sich anhand des Namens nicht identifizieren läßt (es ist ja in der Regel meistens ein java.exe oder javaw.exe), manchmal die einzige Möglichkeit.

Alternativ (oder zusätzlich) käme in Frage, die vom Java-Prozess geöffnete DFÜ-Verbindung über Delphi zu schliessen.

Cheers,

R2009 24. Mär 2009 13:11

Re: ShellExecute_AndWait
 
Hi,

danke dir du hast mich auf die richtige Spur gebracht. Hatte zuerst versucht cmd.exe zu stoppen.

Delphi-Quellcode:
procedure Killprocess(Name:String);
var PEHandle,hproc:cardinal; PE:ProcessEntry32;
begin
PEHandle:=CreateTOOLHelp32Snapshot(TH32cs_Snapprocess,0);
if PEHandle<>Invalid_Handle_Value then
  begin
  PE.dwSize:=Sizeof(ProcessEntry32);
  Process32first(PEHandle,PE);
  repeat
  if Lowercase(PE.szExeFile)=Lowercase(Pchar(Name)) then
    begin
    hproc:=openprocess(Process_Terminate,false,pe.th32ProcessID);
    TerminateProcess(hproc,0);
    closehandle(hproc);
    break;
    end;
  until Process32next(PEHandle,PE)=false;
  end;
closehandle(PEHandle);
end;
Aufgerufen mit:
Delphi-Quellcode:
procedure Tmain.Button9Click(Sender: TObject);
begin
  Killprocess('java.exe');
  se2.Lines.Add('Anwahl gestoppt!');
end;
Ist mir bewusst das das nicht schön ist. Aber dass Java eventuell 2 mal offen ist lässt sich beherschen.
Das Programm wird nur von unseren Profis benutzt!

Vielen Dank. Ihr habt mir sehr geholfen!

rollstuhlfahrer 24. Mär 2009 13:14

Re: ShellExecute_AndWait
 
Zitat:

Zitat von mjustin
Wenn das Fenster einen eindeutigen Titel hat, geht es mit kill.exe (aus dem Windows NT Ressource Kit) - so schliesse ich Java-Programme, die z.B. nachts wegen einer Datensicherung vorübergehend nicht laufen dürfen. - Das ist wirklich nicht die eleganteste & professionellste aller Möglichkeiten, aber da der Prozess sich anhand des Namens nicht identifizieren läßt (es ist ja in der Regel meistens ein java.exe oder javaw.exe), manchmal die einzige Möglichkeit.

Ich dachte, dass Kommandozeilenanwendungen, wenn sie kein weiteres Fenster öffnen, kein Fenster haben.

Also:
Zitat:

Alternativ (oder zusätzlich) Einzig und allein käme in Frage, die vom Java-Prozess geöffnete DFÜ-Verbindung über Delphi zu schliessen.
oder mit dem JAVA-Programm irgendwie anders kommunizieren oder gleich ganz ersetzen durch ein anderes Programm.

Bernhard

R2009 24. Mär 2009 13:18

Re: ShellExecute_AndWait
 
Hi Rollstuhlfahrer,

das Problem ist gelöst. (siehe mein Beitrag)
Vom meinem Programm aus wurde ein Prozess cmd --> uploadtool --> java (Fremdkram) gestartet).
Völlig Fensterlos.
Die oben (Killprocess) genannte Methode funktioniert wenn der java Prozess abgeschossen wird.

Viele Grüsse!

mjustin 24. Mär 2009 14:09

Re: ShellExecute_AndWait
 
Zitat:

Zitat von rollstuhlfahrer
Ich dachte, dass Kommandozeilenanwendungen, wenn sie kein weiteres Fenster öffnen, kein Fenster haben.

Irgendwo muss die Kommandozeile ja erscheinen - bei den gängigen Betriebssystemen ist das meistens in einem Fenster ;)

mjustin 24. Mär 2009 14:24

Re: ShellExecute_AndWait
 
Zitat:

Zitat von R2009
Die oben (Killprocess) genannte Methode funktioniert wenn der java Prozess abgeschossen wird.

Damit wird nur irgendein gerade laufender Prozess abgeschossen, der zufällig java.exe heisst - das ist vielleicht manchmal der richtige, manchmal nicht (da mehrere Anwendungen gleichzeitig laufen können, die alle den Prozessnamen java.exe haben). Diese Lösung wirkt daher ein wenig amateurmäßig :warn:

Man kann in Delphi auch einen Java-Prozess direkt starten und kontrolliert beenden, wenn java.exe direkt - anstatt über CMD und das Batch - gestartet wird. Das geht aber nur, wenn die sonstigen Startparameter bekannt sind, die an java.exe übergeben werden. Falls die Parameter sich aber ändern (und man sie in Delphi nicht ermitteln kann), ist die Lösung mit KillProcess ohne Frage nicht die schlechteste.

DeddyH 24. Mär 2009 14:26

Re: ShellExecute_AndWait
 
Zitat:

Zitat von mjustin
Zitat:

Zitat von rollstuhlfahrer
Ich dachte, dass Kommandozeilenanwendungen, wenn sie kein weiteres Fenster öffnen, kein Fenster haben.

Irgendwo muss die Kommandozeile ja erscheinen - bei den gängigen Betriebssystemen ist das meistens in einem Fenster ;)

Dann schreib mal eine Konsolenanwendung und lösch die Direktrive
Delphi-Quellcode:
{$APPTYPE CONSOLE}
raus ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:49 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