AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ShellExecute_AndWait

Ein Thema von R2009 · begonnen am 24. Mär 2009 · letzter Beitrag vom 24. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#1

ShellExecute_AndWait

  Alt 24. Mär 2009, 10:35
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!

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!
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#2

Re: ShellExecute_AndWait

  Alt 24. Mär 2009, 12:04
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#3

Re: ShellExecute_AndWait

  Alt 24. Mär 2009, 12:46
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#4

Re: ShellExecute_AndWait

  Alt 24. Mär 2009, 13:04
Zitat von R2009:

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,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#5

Re: ShellExecute_AndWait

  Alt 24. Mär 2009, 13:11
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!
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#6

Re: ShellExecute_AndWait

  Alt 24. Mär 2009, 13:14
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#7

Re: ShellExecute_AndWait

  Alt 24. Mär 2009, 13:18
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!
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#8

Re: ShellExecute_AndWait

  Alt 24. Mär 2009, 14:09
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
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#9

Re: ShellExecute_AndWait

  Alt 24. Mär 2009, 14:24
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

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.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: ShellExecute_AndWait

  Alt 24. Mär 2009, 14:26
Zitat von mjustin:
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{$APPTYPE CONSOLE} raus
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:15 Uhr.
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