Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Vollständige Pfadübergabe über shellexecute schlägt fehl
kandesbunzler - Di 18.11.08 19:52
Titel: Vollständige Pfadübergabe über shellexecute schlägt fehl
Hallo allerseits,
ich möchte mit shellexecute eine Kommandozeile mit Pfadangabe starten.
Bsp: "c:\program files\meine programme".
Dummerweise wird in der DOS-Box nur bis "c:\program" interpretiert, d.h. nach dem Leerzeichen geht es nicht weiter.
Was könnte die Ursache sein?
Auf bald ...
kandesbunzler.
AXMD - Di 18.11.08 19:56
Hallo!
Setz den Pfad doch einfach unter doppelte Anführungszeichen, z.B.:
Delphi-Quelltext
1:
| '"c:\program files\meine programme\test.exe"' |
AXMD
kandesbunzler - Di 18.11.08 21:56
Hallo,
das habe ich schon (sorry für mein unvollständige Schreibweise). Genau in der Form, wie Du beschrieben hast, wird im DOS-Fenster nach dem ersten Leerzeichen abgebrochen und damit der Rest nicht 'gefunden'.
Auf bald ...
kandesbunzler.
Xentar - Di 18.11.08 22:00
Dann machst du was falsch.
Normalerweise sollten es dir "" tun.
Zeig mal den Code.
kandesbunzler - Di 18.11.08 22:33
Dann will ich mal versuchen :-) :
1. Kommandozeile := '/K ' + '"' + Pfad_zu_EXE + '"';
2. shellexecute (handle, 'open', PCHAR ('cmd.exe '), PChar (Kommandozeile), nil, Sw_ShowNormal);
Zumindest im Debugger wird die Kommandozeile als String korrekt übergeben. Der Parameter '/K ' verhindert das automatische Schließen der DOS-Box (solange ich noch bei der Fehlersuche bin ...). Allerdings besteht das Problem auch ohne '/K ' ...
Auf bald ...
kandesbunzler.
AXMD - Di 18.11.08 22:37
Dann ist die Sache ja relativ klar: du übergibst ja den ganzen EXE-Pfad noch einmal als Parameter. Entweder du führst ein Escaping der doppelten Anführungszeichen durch, damit cmd.exe diese auch als solche erkennt (siehe markierte Stellen unten) oder du machst das Ganze einfach ohne cmd.exe und verzichtest darauf, dass sich die EXE wieder selbst nach ihrer Beeindigung schließt.
kandesbunzler hat folgendes geschrieben : |
1. Kommandozeile := '/K ' + '^"' + Pfad_zu_EXE + '^"';
2. shellexecute (handle, 'open', PCHAR ('cmd.exe '), PChar (Kommandozeile), nil, Sw_ShowNormal); |
AXMD
Xentar - Di 18.11.08 22:39
Kann es sein, dass du in Pfad_zu_EXE auch nochmal Anführungsstriche drin hast?
AXMD - Di 18.11.08 22:42
Xentar hat folgendes geschrieben : |
Kann es sein, dass du in Pfad_zu_EXE auch nochmal Anführungsstriche drin hast? |
Das ist noch ein guter Punkt. Hier in Kombination mit dem von mir oben erwähnten Escaping ein Beispiel, das funktioniert:
Quelltext
1:
| cmd.exe /K ^"C:\Program Files\Adobe\Reader 9.0\Reader\acrord32.exe^" |
Man beachte hier wieder das Escaping der doppelten Anführungszeichen.
AXMD
//EDIT:
Crosspost DP [
http://www.delphipraxis.net/topic146550,0,asc,0.html]
Xentar - Di 18.11.08 22:46
AXMD hat folgendes geschrieben : |
Quelltext 1:
| cmd.exe /K ^"C:\Program Files\Adobe\Reader 9.0\Reader\acrord32.exe^" |
Man beachte hier wieder das Escaping der doppelten Anführungszeichen.
|
Hm, wenn ich das unter Start -> Ausführen reinhacke, bekomme ich trotzdem den Fehler
Zitat: |
Der Befehl "C:\Program" ist entweder falsch geschrieben oder
konnte nicht gefunden werden. |
AXMD - Di 18.11.08 22:54
Wenn du den Aufruf aus einem Eingabeaufforderungsfenster heraus startest funktioniert er nur mit dem Escaping, unter Start Ausführen nur ohne.
AXMD
kandesbunzler - Mi 19.11.08 10:49
Hallo allerseits,
ich habe mal einen Screenshot angehangen, welcher das Ziel genauer zeigt.
Ich muß Pfad und aufrufendes Programm in Doppelhochkomma starten, gefolgt von den Parametern, welche tws. ebenfalls in Doppelhochkomma eingeschlossen sind.
Auf bald ...
kandesbunzler.
AXMD - Mi 19.11.08 10:51
Funktioniert es denn jetzt mit den Hinweisen, die wir dir gegeben haben? Poste bitte deinen aktuellen Quelltext.
AXMD
kandesbunzler - Mi 19.11.08 11:38
Hallo allerseits,
unter Verwendung des Befehles:
---BEGIN
Kommandozeile := '/K ' + '^"' + Pfad_zu_EXE + '^"' + ' /xyz-' + ' /abcdef /ft\"Mein Logo\" /ca';
shellexecute (handle, 'open', PCHAR ('cmd.exe '), PChar (Kommandozeile), nil, Sw_ShowNormal);
---END
erhalte ich in der DOS-Box:
---BEGIN
'"C:\Program' is not recognized as an internal or external command,
operable program or batch file.
---END
Den Wert von Pfad_zu_EXE ermittle ich aus OpenDialog.
Wie gesagt, im Debugger steht der Inhalt, wie er sein soll, aber leider wird dieser offensichtlich nicht in der korrekten Form übergeben.
Auf bald ...
kandesbunzler.
AXMD - Mi 19.11.08 11:58
Warum führtst du das Escaping einmal mit Zirkumflex (^) und einmal mit Backslash durch? Wenn dann nur mit Zirkumflex oder du versuchst (wie oben geschrieben) vollständig auf das Escapting zu verzichten. Wie ist dann das Ergebnis?
AXMD
kandesbunzler - Mi 19.11.08 15:07
Hallo,
vielleicht habe ich mich auch nicht genau genug ausgedrückt. Ich muß die gesamte Zeile in der DOS-Box aufrufen, d.h. einschließlich aller Zahlen, Zeichen, Sonderzeichen etc. Das Beispiel zeigt den KOMPLETT zu übergebenden Befehl (einschließlich aller doppelten Hochkomma, Slashes & Backslashes, Parameter - einfach ALLES):
"c:\Program Files\Mein Programm" /abc-1234567 /xyz123456 /xy\"Mein Kommentar\" /ab
Ergo, ich darf keine Zeichen o.ä. escapen.
Auf bald ...
kandesbunzler.
AXMD - Mi 19.11.08 15:12
kandesbunzler hat folgendes geschrieben : |
"c:\Program Files\Mein Programm" /abc-1234567 /xyz123456 /xy\"Mein Kommentar\" /ab |
Was ist dann das, wenn kein Escaping? Und noch einmal: Poste bitte deinen aktuellen Code!
AXMD
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!