Autor Beitrag
Addy88
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP, Win 7

BeitragVerfasst: Di 29.11.11 00:38 
Hallo zusammen,

ich hab mal wieder ein Poblem, ich versuche Apache-Ant aus Delphi heraus aufzurufen. Das sieht wie folgt aus:
ausblenden 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), nilnil, 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Di 29.11.11 02:36 
Die Parameter für das aufgerufene Programm gehören im Aufruf in einen eigenen Parameter:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP, Win 7

BeitragVerfasst: 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.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 29.11.11 20:15 
user profile iconAddy88 hat folgendes geschrieben Zum zitierten Posting springen:
danke erstmal, allerdings funktioniert es so immernoch nicht.
Was funktioniert dann nicht? Der Rückgabewert sagt schließlich jetzt alles ok. :nixweiss:

user profile iconAddy88 hat folgendes geschrieben Zum zitierten Posting springen:
Nun bekomm ich den ReturnCode 42.
MSDN Dokumentation hat folgendes geschrieben:
If the function succeeds, it returns a value greater than 32.
Addy88 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP, Win 7

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 29.11.11 20:37 
user profile iconAddy88 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP, Win 7

BeitragVerfasst: Di 29.11.11 21:00 
Ich habs jetzt mal so gemacht:

ausblenden 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), nil0);
    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP, Win 7

BeitragVerfasst: Di 29.11.11 21:05 
Sorry, du hast natürlich recht.... Wird langsam schlimm mit mir -.-

Moderiert von user profile iconNarses: Beiträge zusammengefasst

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 29.11.11 21:11 
Dann probiere /k statt /c damit es da bleibt. ;-)
Addy88 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP, Win 7

BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP, Win 7

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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 08.12.11 14:00 
der Teil bis "+project+" sollte funktionieren, stecken in den Variablen auch noch nicht gequotete Pfadangaben?

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Addy88 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP, Win 7

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.