Problem mit ShellExecute
spacer
Autor Nachricht
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 markieren
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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
SvenAbeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 328
Erhaltene Danke: 2



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 markieren
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));
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, 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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, 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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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 markieren
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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, 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...
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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 markieren
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?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Di 29.11.11 21:11 
Dann probiere /k statt /c damit es da bleibt. ;-)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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 markieren
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?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 979
Erhaltene Danke: 124

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
DRY DRY KISS
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, 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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home