Entwickler-Ecke
Windows API - Problem mit ShellExecute
Addy88 - Di 29.11.11 00:38
Titel: Problem mit ShellExecute
Hallo zusammen,
ich hab mal wieder ein Poblem, ich versuche Apache-Ant aus Delphi heraus aufzurufen. Das sieht wie folgt aus:
Delphi-Quelltext
1: 2: 3: 4:
| aufruf:=('"'+ant_home+'\bin\ant.bat" -Dproject='+project+' -Dsource_version='+source_version+' -Dtarget_version='+target_version+' -f "'+workdir+'\build_system.xml" new'); ExecResult:=ShellExecute(handle, 'open', PWideChar(aufruf), nil, nil, SW_SHOW); edit5.Text:=aufruf; ShowMessage(inttostr(ExecResult)); |
wenn ich die Ausgabe des Edit Feldes in die CMD eingebe dann läuft das auch, allerdings bekomme ich wenn ich das ShellExecute ausführe immer den RetunCode=2
Weiß hier einer Rat?
Danke im voraus.
SvenAbeln - Di 29.11.11 02:36
Die Parameter für das aufgerufene Programm gehören im Aufruf in einen eigenen Parameter:
Delphi-Quelltext
1: 2: 3: 4: 5:
| aufruf:='"'+ant_home+'\bin\ant.bat"'; parameter = '-Dproject='+project+' -Dsource_version='+source_version+' -Dtarget_version='+target_version+' -f "'+workdir+'\build_system.xml" new'; ExecResult:=ShellExecute(handle, 'open', PChar(aufruf), PChar(parameter), nil, SW_SHOW); edit5.Text:=aufruf; ShowMessage(inttostr(ExecResult)); |
Addy88 - Di 29.11.11 19:47
Hi,
danke erstmal, allerdings funktioniert es so immernoch nicht.
Nun bekomm ich den ReturnCode 42.
Wenn ich die Ausgabe der beiden Variablen in der CMD ausführe funktioniert es wieder.
Addy88 - Di 29.11.11 20:24
Also das Ant Script schreibt bei der Ausführung direkt ein log, und ich habe fürs testen erstmal einen sleep Task von 2 Minuten eingebaut.
Allerdings wird das log nicht geschrieben und auch das sleep wird scheinbar nicht ausgeführt da ich direkt nach dem klick auf den Start Button die Message mit dem ReturnCode bekomme.
Ich geh ja mal stark davon aus das shellexecute solange wartet bis das aufgerufene Programm ausgeführt wurde?!
Edit:
wenn ich bei parameter noch ">> test.log" anhänge schreibt er mir ein leeres file
jaenicke - Di 29.11.11 20:37
Addy88 hat folgendes geschrieben : |
Ich geh ja mal stark davon aus das shellexecute solange wartet bis das aufgerufene Programm ausgeführt wurde?! |
Nein, warum sollte es? Das würde ja alles blockieren.
// EDIT:
Versuche als Befehl doch einmal die cmd.exe mit deinem Befehl als Parameter. Dann kannst du die gesamte Ausgabe in eine Datei schreiben. Davon abgesehen kannst du auch einfach die Ausgabe des Aufrufs einmal auslesen, Code dafür findest du über die Suche.
Addy88 - Di 29.11.11 21:00
Ich habs jetzt mal so gemacht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| if checkbox1.Checked=true then begin params:=('"'+ant_home+'\bin\ant.bat" -Dproject='+project+' -Dsource_version='+source_version+' -Dtarget_version='+target_version+' -f "'+workdir+'\build_system.xml" new >>test.log'); ExecResult:=ShellExecute(handle, 'open', 'cmd.exe', PChar(params), nil, 0); ShowMessage(inttostr(ExecResult)); end; |
Das logfile bleibt trotzdem leer.
Also es sieht mir so aus als würde er zwar die ant.bat aufrufen aber nichts übergeben
jaenicke - Di 29.11.11 21:04
Du solltest dir erstmal die Parameter der cmd.exe anschauen...
Da fehlt ein /c vor dem auszuführenden Befehl...
Addy88 - Di 29.11.11 21:05
Sorry, du hast natürlich recht.... Wird langsam schlimm mit mir -.-
Moderiert von
Narses: Beiträge zusammengefasst
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| if checkbox1.Checked=true then begin params:=('/C "'+ant_home+'\bin\ant.bat" -Dproject='+project+' -Dsource_version='+source_version+' -Dtarget_version='+target_version+' -f "'+workdir+'\build_system.xml" new >>test.log'); ExecResult:=ShellExecute(handle, 'open', 'cmd.exe', PChar(params), nil, SW_SHOW); ShowMessage(inttostr(ExecResult)); end; |
So nun seh ich kurz ein CMD Fenster aufblinken welches sich sofort wieder schließt, das log bleibt leer.
An der maskierung der variablen in params kann es nicht liegen?
jaenicke - Di 29.11.11 21:11
Dann probiere /k statt /c damit es da bleibt. ;-)
Addy88 - Di 29.11.11 21:19
:-) wieder was gelernt
wir kommen der sache näher:
Der Befehl "C:\Program" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
ant_home hat Wert:
C:\Program Files (x86)\NetBeans 7.0.1\java\ant
Und sollte ja anhand der " passend maskiert werden damit in der CMD eben die Leerzeichen nicht stören
Addy88 - Do 08.12.11 13:43
So nach langem hin und her probieren bin ich immer noch nicht zu einem funktionierendem Ergebnis gekommen.
Ich habs jetzt mal so gemacht um zu sehen ob die Maskierung von Pfaden mit Leerzeichen funktioniert:
Delphi-Quelltext
1: 2: 3: 4: 5:
| begin params:=('/K "c:\Program Files (x86)\NetBeans 7.0.1\java\ant\bin\ant.bat" -Dproject='+project+' -Dsource_version='+source_version+' -Dtarget_version='+target_version+' "-f d:\build_system.xml" new ">> test.log"'); ExecResult:=ShellExecute(handle, 'open', 'CMD', PChar(params), nil, SW_SHOW); ShowMessage(inttostr(ExecResult)); end; |
Da ich in der Kommandozeile jedoch immer den folgenden Fehler bekomme, scheint es, als ob mit der Maskierung definitiv irgendwas verkehrt ist:
"Der Befehl "c:\Program" ist entweder falsch geschrieben oder konnte nicht gefunden werden."
Hat hier denn keiner noch irgendeine Idee?
bummi - Do 08.12.11 14:00
der Teil bis "+project+" sollte funktionieren, stecken in den Variablen auch noch nicht gequotete Pfadangaben?
Addy88 - Do 08.12.11 14:14
Hey, nein in den folgenden Variablen sind keine Pfadangaben mehr enthalten. "c:\Program Files (x86)\NetBeans 7.0.1\java\ant\bin\ant.bat" ist die einzigste Pfadangabe die so beginnt, nach -f ist noch eine aber da sind in der jetzigen Variante keine Leerzeichen drin. Deswegen sieht es mir eben so aus als ob die "" am Anfang schon komplett ignoriert werden. Wenn ich "c:\Program Files (x86)\NetBeans 7.0.1\java\ant\bin\ant.bat" allerdings als auszuführende Datei angebe wird die ant.bat aufgerufen allerdings sofort wieder geschlossen da keine Parameter übergeben wurden. Also ist meine Vermutung das es lediglich bei der Parameterübergabe ein Problem mit der Maskierung gibt.
jaenicke - Do 08.12.11 14:19
Das Problem ist, dass bereits bei der ersten Parameterübergabe (an die cmd.exe) die Anführungszeichen entfernt werden. Diese setzt die nicht wieder.
Erstelle eine temporäre Batchdatei und führe die aus oder starte eine cmd.exe permanent und übergib die Befehle per Pipe. Letzteres geht mit TDosCommand oder so ähnlich sehr einfach.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!