![]() |
ShellExcecute Formulierung
Wie macht man die Pfaddefinition für Shellexecute?
Das folgende geht nicht, man beachte die Leerzeichen zwischen Projekte und 7 in den Pfadangaben:
Delphi-Quellcode:
(Parameter -w bekommt den Wert 256, -h ebenso usw., insofern also normale Parameterübergabe, -o ist der Paramater OutputPath, )
WorkPath := 'C:\Users\geldis\Projekt 7';
OutPath := 'C:\Users\geldis\Projekt 7\OUT'; ChDir (WorkPath); ShellExecute(0, 'open', PChar('polon.exe'), pchar('sample.jpg -w 256 -h 256 -f tga -o '+ OutPath), nil, SW_Hide); Sobald ich die Lücke in den Pfadangaben (Leerzeichen halt) durch einen Unterstrich schliesse geht es anstandslos. Vermutlich interpretiert er die Leerstelle als 'jetzt kommt ein weiterer Parameter'. Frage: Kann man diese Pfadangabe irgendwie 'maskieren'? geldis |
AW: ShellExcecute Formulierung
.. versuche mal den Pfad in double quotes "" zu packen.
Grüße Klaus |
AW: ShellExcecute Formulierung
Wie ist es so?
Delphi-Quellcode:
WorkFile := '"C:\Users\geldis\Projekt 7\polon.exe"';
OutPath := '"C:\Users\geldis\Projekt 7\OUT"'; Params := 'sample.jpg -w 256 -h 256 -f tga -o ' + OutPath; // ChDir (WorkPath); ShellExecute(0, 'open', PChar(WorkFile), PChar(Params), nil, SW_Hide); |
AW: ShellExcecute Formulierung
Hier würd' ich zusätzlich noch versuchen, den Rückgabewert von ShellExecute auszuwerten, der könnte dann z. B. "ERROR_FILE_NOT_FOUND = The specified file was not found." oder "ERROR_PATH_NOT_FOUND = The specified path was not found." oder weiteres lauten.
ChDir liefert leider keinen Rückgabewert, ob's geklappt hat oder nicht, aber mit GetCurrentDir kann man das prüfen. (Und in neueren Delphis geht's vermutlich noch eleganter.)
Delphi-Quellcode:
ChDir(WorkPath);
if GetCurrentDir <> WorkPath then begin Fehlermeldung zu ungültigem Pfad end else begin iResult := ShellExecute(0, 'open', PChar(WorkFile), PChar(Params), nil, SW_Hide); if iResult <= 32 then begin // Mögliche Fehler sind hier: https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutea Fehlermeldung zu erfolglosem ShellExecute. end; end; |
AW: ShellExcecute Formulierung
Bei WorkPath gehören keine " rein (außer der wird zusammen mit den Parametern als "eine" CommandLine angegeben ... wie z.B. bei WinExec, was aber hoffentlich niemand mehr verwendet),
aber ja, bei den Parametern gehören natülich die " um den OutPath. |
AW: ShellExcecute Formulierung
Besten Dank für alle Antworten!
Das einfassen in DoubleQuotes war der richtige Weg. Diese Version klappt:
Delphi-Quellcode:
Diese Version klappt nicht : Man beachte den BackSlash am Ende von InPath, dafür keinen vor dem Dateinamen in Params. Ergebnis: Eingabedatei nicht gefunden. Der Slash muss in den Parametern angegeben werden. Finde ich merkwürdig.
WorkFile := '"C:\Users\Geldis\Projekt 7\PIC\polon.exe"';
OutPath := '"C:\Users\Geldis\Projekt 7\OUT"'; InPath := '"C:\Users\Geldis\Projekt 7\IN"'; Params := InPath + '\sample.jpg -w 256 -h 256 -ft tga -o ' + OutPath; ShellExecute(0, 'open', PChar(WorkFile), PChar(Params), nil, SW_HIDE);
Delphi-Quellcode:
WorkFile := '"C:\Users\Geldis\Projekt 7\PIC\polon.exe"';
OutPath := '"C:\Users\Geldis\Projekt 7\OUT"'; InPath := '"C:\Users\Geldis\Projekt 7\IN\"'; Params := InPath + 'sample.jpg -w 256 -h 256 -ft tga -o ' + OutPath; ShellExecute(0, 'open', PChar(WorkFile), PChar(Params), nil, SW_HIDE); Nochmal vielen Dank! geldis |
AW: ShellExcecute Formulierung
Das ist aber eher Zufall:
Delphi-Quellcode:
Das müsste wohl eher so aussehen:
InPath := '"C:\Users\Geldis\Projekt 7\IN"';
Params := InPath + '\sample.jpg -w 256 -h 256 -ft tga -o ' + OutPath;
Delphi-Quellcode:
Die doppelten Hochkommata müssen (eigentlich) den kompletten Dateinamen, also Pfad und Dateinamen, umschließen und nicht nur den Pfad.
InPath := 'C:\Users\Geldis\Projekt 7\IN';
Params := '"' + InPath + '\sample.jpg" -w 256 -h 256 -ft tga -o ' + OutPath; Wie wird das denn, wenn der Dateiname auch Leerzeichen enthält?
Delphi-Quellcode:
oder
InPath := '"C:\Users\Geldis\Projekt 7\IN"';
Params := InPath + '"\sample 1.jpg" -w 256 -h 256 -ft tga -o ' + OutPath;
Delphi-Quellcode:
Bei mir sähe das eher so aus:
InPath := '"C:\Users\Geldis\Projekt 7\IN"';
Params := InPath + '\"sample 1.jpg" -w 256 -h 256 -ft tga -o ' + OutPath;
Delphi-Quellcode:
Und der Rückgabewert von ShellExecute wird abgefragt. Immer!
WorkFile := '"C:\Users\Geldis\Projekt 7\PIC\polon.exe"';
OutPath := 'C:\Users\Geldis\Projekt 7\OUT\'; InPath := 'C:\Users\Geldis\Projekt 7\IN\'; InFile := 'sample.jpg'; Params := Format('"%s%s" -w 256 -h 256 -ft tga -o "%s"',[InPath,InFile,OutPath]); if ShellExecute(0, 'open', PChar(WorkFile), PChar(Params), nil, SW_HIDE) <= 32 then begin Fehlerbehandlung, Fehlermeldung ... end; Das Ganze erscheint mir noch überarbeitungswürdig. Eine verlässliche Funktionsweise würd' ich bei Deiner momentane Lösung eher nicht erwarten. |
AW: ShellExcecute Formulierung
Ja, man kann "oftmals" auch nur Teile eines Strings mit " escapen, aber eigentlich gehören eher die vorne und hinten dran, anstatt zwischendrein.
Delphi-Quellcode:
Und natürlich hoffe ich, dass du von diesem Funktionsaufruf auch die Rückgabewerte auswertest.
WorkFile := 'C:\Users\Geldis\Projekt 7\PIC\polon.exe';
OutPath := 'C:\Users\Geldis\Projekt 7\OUT'; InPath := 'C:\Users\Geldis\Projekt 7\IN'; Params := '"' + InPath + '\sample.jpg" -w 256 -h 256 -ft tga -o "' + OutPath + '"'; // oder mit Format oder so ... Hauptsache die " stimmen ShellExecute(0, 'open', PChar(WorkFile), PChar(Params), nil, SW_HIDE); Noch was zur Bezeichnung, das Letzte Codebeispiel von dir ist ein OutDir und InPath (mit und ohne abschließenden PaphDelimitert), aber sind nur Haarspalterreien (Hauptsache für eine Variante wird die "selbe" Bezeichnug verwendet). |
AW: ShellExcecute Formulierung
Zitat:
|
AW: ShellExcecute Formulierung
Och, die "speziellen" Rückgabewerte beim ShellExecute kann man auch ignorieren.
Einfach nur den Bereich mit < oder > prüfen (es ginge auch eine Bitmaske auf die ersten 5 Bits, aber auch wenn es passt, ist es offiziell ja was Anderes) und dann dann ganz normal mit GetLastError (Microsoft hat das irgendwann mal hinzugefügt), bzw. RaiseLastOSError. |
AW: ShellExcecute Formulierung
@delphi.narium
War Zufall. Ist mir eben vor die Füsse gefallen. Dein Vorschlag funktioniert bestens, vielen Dank. :thumb: Leerzeichen im Dateinamen sind so auch kein Problem. Auch an alle anderen natürlich. :-D geldis Ups, eines noch: der Slash am Ende vom OutPath passt ihm allerdings gar nicht. |
AW: ShellExcecute Formulierung
Wem passt das nicht?
Dem? -> polon.exe Oder dem? -> ShellExecute Bei ShellExecute würd' mich das eher wundern. Gibt es denn OutPath?
Delphi-Quellcode:
(ungetestet hingedaddelt)
WorkFile := '"C:\Users\Geldis\Projekt 7\PIC\polon.exe"';
OutPath := 'C:\Users\Geldis\Projekt 7\OUT\'; if not ForceDirectories(OutPath) then begin Fehlermeldung, dass der Ausgabepfad nicht erstellt werden kann. end else begin InPath := 'C:\Users\Geldis\Projekt 7\IN\'; if not ForceDirectories(InPath) then begin Fehlermeldung, dass der Eingabepfad nicht erstellt werden kann. end else InFile := Format('"%s%s"',[InPath,'sample.jpg']); if not FileExists(InFile) then begin Fehlermeldung, dass es das InFile nicht gibt. end else begin // Wenn polon.exe ein Problem mit dem abschließenden \ hat so: Params := Format('%s -w 256 -h 256 -ft tga -o "%s"',[InFile,ExcludeTrailingPathDelimiter(OutPath)]); // ansonsten so: Params := Format('%s -w 256 -h 256 -ft tga -o "%s"',[InFile,OutPath]); if ShellExecute(0, 'open', PChar(WorkFile), PChar(Params), nil, SW_HIDE) <= 32 then begin Fehlerbehandlung, Fehlermeldung ... end; end; end; end; |
AW: ShellExcecute Formulierung
Achso:
ShellExecute hat da doch noch so einen Parameter, der momentan Nil ist. Heißt irgendwie "Directory"! Da könnte man ja dann ggfls. den OutPath angeben. Keine Ahnung wie polon.exe arbeitet. Wo schreibt's hin, wenn kein OutPath angegeben ist? Ins aktuelle Verzeichnis, das wäre dann das im Directoryparameter von ShellExecute. In dem Fall könnte dann eventuell die Angabe des OutPath in den Parametern entfallen. Ist jetzt alles nur Spekulation, aber eventuell hilft's ja irgendwie weiter. |
AW: ShellExcecute Formulierung
Zitat:
|
AW: ShellExcecute Formulierung
Und es kommt drauf an, wo der Ausgabepfad/Arbeitsverzeichnis liegt.
Nicht Jeder kann bei Allem mit Netzwerkpfaden umgehen, wie z.B. die Console nicht. So müßte man dann sicher sein, dass sowas dann nie vorkommen kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz