Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ShellExcecute Formulierung (https://www.delphipraxis.net/209886-shellexcecute-formulierung.html)

geldis 4. Feb 2022 08:09

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:
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);
(Parameter -w bekommt den Wert 256, -h ebenso usw., insofern also normale Parameterübergabe, -o ist der Paramater OutputPath, )

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

Klaus01 4. Feb 2022 08:11

AW: ShellExcecute Formulierung
 
.. versuche mal den Pfad in double quotes "" zu packen.

Grüße
Klaus

DeddyH 4. Feb 2022 08:32

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);

Delphi.Narium 4. Feb 2022 08:58

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;

himitsu 4. Feb 2022 09:27

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.

geldis 4. Feb 2022 09:35

AW: ShellExcecute Formulierung
 
Besten Dank für alle Antworten!

Das einfassen in DoubleQuotes war der richtige Weg. Diese Version klappt:
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);
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.

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

Delphi.Narium 4. Feb 2022 09:59

AW: ShellExcecute Formulierung
 
Das ist aber eher Zufall:
Delphi-Quellcode:
InPath := '"C:\Users\Geldis\Projekt 7\IN"';
Params := InPath + '\sample.jpg -w 256 -h 256 -ft tga -o ' + OutPath;
Das müsste wohl eher so aussehen:
Delphi-Quellcode:
InPath := 'C:\Users\Geldis\Projekt 7\IN';
Params := '"' + InPath + '\sample.jpg" -w 256 -h 256 -ft tga -o ' + OutPath;
Die doppelten Hochkommata müssen (eigentlich) den kompletten Dateinamen, also Pfad und Dateinamen, umschließen und nicht nur den Pfad.

Wie wird das denn, wenn der Dateiname auch Leerzeichen enthält?
Delphi-Quellcode:
InPath := '"C:\Users\Geldis\Projekt 7\IN"';
Params := InPath + '"\sample 1.jpg" -w 256 -h 256 -ft tga -o ' + OutPath;
oder
Delphi-Quellcode:
InPath := '"C:\Users\Geldis\Projekt 7\IN"';
Params := InPath + '\"sample 1.jpg" -w 256 -h 256 -ft tga -o ' + OutPath;
Bei mir sähe das eher so aus:
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\';
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;
Und der Rückgabewert von ShellExecute wird abgefragt. Immer!

Das Ganze erscheint mir noch überarbeitungswürdig. Eine verlässliche Funktionsweise würd' ich bei Deiner momentane Lösung eher nicht erwarten.

himitsu 4. Feb 2022 10:00

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:
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);
Und natürlich hoffe ich, dass du von diesem Funktionsaufruf auch die Rückgabewerte auswertest.



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).

uligerhardt 4. Feb 2022 11:19

AW: ShellExcecute Formulierung
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1501684)
Hier würd' ich zusätzlich noch versuchen, den Rückgabewert von ShellExecute auszuwerten

Ich würde für ShellExecuteEx plädieren. Das hat ein vernünftigeres Fehlerhandling.

himitsu 4. Feb 2022 11:40

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:30 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz